Neues Modul readingsGroup

Begonnen von Niko, 24 August 2013, 11:59:11

Vorheriges Thema - Nächstes Thema

Elektrolurch

Dann ist ja gut. Das lange posting des logs schaut sich sowieso niemand an. Viel hilft nicht immer viel.

Elektrolurch
configDB und Windows befreite Zone!

franky08

Der Filter im Event Monitor funktioniert bei mir nicht und Andre wollte die Meldungen aus dem Event Monitor mal sehen.

VG
Frank
Debian Bookworm auf HUNSN / Debian Bullseye auf 2.ter HUNSN F2F an 2x RaspiB
mit FHEM aktuell
22Zoll ViewSonic als Infodislay (WVC)
3xHMLAN mit vccu, raspmatic_rpi3, HMIP-HCU1

Elektrolurch

Das Listing ist aber ewig lang und macht den Artikel nicht gerade übersichtlicher.
Außerdem wurde hier im Forum auch schon festgestellt, dass das Einstellen von Beiträgen um so länger dauert, je länger der Artikel wird.
Wenn schon langes Listing, dann als Anhang (Datei).
Danke.
configDB und Windows befreite Zone!

igami

Zitat von: justme1968 am 24 Juni 2015, 15:19:52
@igami: longpoll updates gehen nur wenn es ein original reading gibt und dieses entweder direkt verwendet oder über <{...}@reading> eingebunden wird. ich bin mir nicht sicher ob ich verstehe warum du überhaupt über !readings gehst.

ich würde sagen das einfachste ist im device selber das icon per devStateIcon zu vergeben und dann im der readingGroup in das value icon auf {state => '%devStateIcon'} zu setzen. und ganz nebenbei hast du auch noch im original device ein passendes icon.

Ich bin über die !readings gegangen weil es sich immer um state handelt und ich nicht wusste, wie ich dafür unterschiedliche icons angeben sollte, aber das mit dem mappen auf %devStateIcon bewirkt ja genau was ich möchte.

Vielen Dank.

igami
Pi3 mit fhem.cfg + DbLog/logProxy
Komm vorbei zum FHEM Treffen im Kreis Gütersloh! Das nächste Mal im April 2020.

MAINTAINER: archetype, LuftdatenInfo, monitoring, msgDialog, Nmap, powerMap
ToDo: AVScene, FluxLED

Elektrolurch

#1399
Hallo Andre,

ich habe mir folgendes gebaut:
Da wo in einer rg ein Icon angezeigt werden soll, möchte ich unter dem Icon auch einen Text  ausgeben (wg. Barrierefreiheit). Da die Icons anklickbar sind (commands->Befehl) und auf meinem per Tasten bedienbaren Nokia Iconen nicht immer einwandfrei selektiert werden, soll der Label_Text auch noch anklickbar sein und darunter stehen.
leider
Mit valueIcon geht das nicht ganz so einwandfrei, aber mit valueFormat:

...valueFormat {'UP' => '{MakeIconwithLabel("fts_shutter_up",$VALUE,"öffnen")}',...

Die sub sieht so aus:
sub MakeIconwithLabel($$$)
{
my ($icon,$value,$label) = @_;
my $html;
$html = FW_makeImage($icon, $value, "icon");
$html .= '<br><span style="text-align:center"; "font-size:9px">' . $label . '</span>';
return $html;
} # end sub MakeIconwithLabel


klappt auch wie gewünscht.
Nun meine Frage:
Ich möchte den state mit dem devStateIcon ausgeben:

...valueFormat {'state' => '{MakeIconwithLabel("%devStateIcon",$VALUE,$VALUE)}',...

mit %devStateIcon geht es nicht.
Und $devStateIcon gibt es wohl auch nicht.
Vermutlich ist die Lösung ganz einfach, ... aber....


Und da habe ich noch was zum knobeln:

In einer rg zeige ich alle Thermostate an. Die "desired-temp" springt bei den fhts auf 12.0, wenn ein Fenster offen ist. Mit einer entsprechenden valueIcon wird dann statt des Auswahlmenüs für die desired-temp ein offenes Fenster angezeigt. Leider ist dies aber immer noch anklickbar und sendet "set th desired-temp 12.0" an das Thermostat. Im Sommer stehen aber die fhts alle auf "off" (nur bei offenem Fenster wird 12.0 angezeigt). Das Klicken hätte jetzt zur Folge, dass eine Aktivierung des Heizkreises stattfindet.
Wie kann ich also für 12.0 commands für desired-temp ausnehmen?

commands {'desired-temp.12.0' => '', 'desired-temp' => 'desired-temp:-,off,16.0,16.5,17.0,17.5,18.0,18.5,19.0,19.5,20.0,20.5,21.0,21.5,22.0,22.5,23.0'

Das desired-temp.12.0 => '' zeigt leider keine Wirkung.

Das Icon:
valueIcon ... 'desired-temp.12.0' => 'signal_Fenster_Offen.on@red',

funktioniert allerdings, ist aber anklickbar.


Gruß

Elektrolurch
configDB und Windows befreite Zone!

ext23

Guten Morgen,

ich habe mal zwei oder drei Fragen zur readingsgroup. Irgendwie kommt man ja um die readingsgroup nicht rum wenn man die Sachen gescheit formatieren möchte ;-) Im Anhang mein Beispiel von dem ich hier rede. Achso und die Fragen stammen von einem Perl Muffel ;-)

1. Wie kann ich ein ValueIcon zentriert platzieren? attr valueStyle style="text-align:center" hilft hier nicht.

2. Kann ich beim attribut commands auch perl code einbauen? Hintergrund ist das ich das "gießen" erst ermöglichen möchte, wenn die Wassertonne noch voll genug ist. Hat diese den Status leer soll die Gießkanne keine Funktion hinterlegt haben.

3. Ich würde gerne die Zeit anzeigen wann die Schaltsteckdose an der die Pumpe angeschlossen ist zuletzt "ausgelöst" wurde. Einfach um zu sehen wann die Blumen das letzte mal bewässert wurden. Nun ist das ein bissel schwierig aber ich würde einfach mal ein Zeitstempel aus irgend einem reading benutzen (auch wenn diese nicht immer stimmen, geade nach einem status request). Wie mache ich das am besten? "attr notime 1" ist gesetzt.

Gruß
Daniel
HM, KNX, FS20, 1-Wire, PanStamp, AVR-NET-IO, EM1000EM, PCA301, EC3000, HM-LAN, CUL868, RFXtrx433, LGW, DMX @Ubuntu-Server (Hauptsystem) & Raspberry Pi (Satellit)

justme1968

1. ist noch ein offenes todo

2. jein. direkt perl code geht zwar. aber das ist nicht wirklich praktikabel. siehe z.b. hier: http://forum.fhem.de/index.php/topic,14425.msg262811.html#msg262811. aber: du kannst dir den perl code einfach in ein notify stecken und es per trigger ... über commands auslösen.

beim nochmal lesen glaube ich aber du meinst etwas ganz anderes :) ...

dazu gibt es zwei möglichkeiten. wenn es einen eindeutigen wert gibt bei dem nichts passieren soll schreib den explizit vorher hin und mappe ihn auf nichts:..., 'tonne.leer' => undef, 'tone.voll' ='set ...', ...oder wie bei jedem anderen mapping mit perl:..., tonne => '{return undef if( $VALUE <10); return "set ..."; }', ...

3. etwa so:..., <{ReadingsTimestamp($DEVICE,'reading',""}@reading>, ...

gruss
  andre
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

ext23

#1402
Ahh ok, Punkt 3 klappt (auch wenn ich noch nicht so richtig zufrieden bin, es gibt eben kein Zeitstempel der sagt wann die Dose zuletzt aus gegangen ist. Vermutlich müsste man da im Log schauen) UND das ist nicht Longpoll kompatible, zumindest updated der das erst beim refresh.

Punkt 1, ok, unkritisch.

Wegen Punkt 2: Ich hab in meinem Command Attribut:
commands    {"state.off"=>"set %DEVICE on-for-timer 360","state.on"=>"set %DEVICE off"}

Heißt ich müsste ja jetzt noch ein "status.voll" => "set %DEVICE on-for-timer 360" hinzufügen. (status ist das reading von der Tonne) Aber das kann doch so nicht funktionieren oder? Ich brache dann eher eine AND Verknüpfung, also status.voll && state.off, geht das?

Gruß
Daniel
HM, KNX, FS20, 1-Wire, PanStamp, AVR-NET-IO, EM1000EM, PCA301, EC3000, HM-LAN, CUL868, RFXtrx433, LGW, DMX @Ubuntu-Server (Hauptsystem) & Raspberry Pi (Satellit)

TeeVau

Zu Punkt 3:
Ich habe sowas ähnliches letzte Woche gemacht. Vielleicht hilft es dir ja?!. Lediglich Longpoll funktioniert nicht, das mag aber an dem Unwissen zu readingsGroup liegen.
In die 99_myUtils:
# Rechnet aus einem Zeit String (FMT) die Sekunden aus seit Epoche.
# Author : Reinerlein http://forum.fhem.de/index.php/topic,11304.msg65976.html#msg65976
# Aufruf : GetTimeFromString("2015-07-02 15:05:36")
# Param 1: Datum und Zeit im FHEM fmt Format
# Return : Sekunden seit Epoche
sub GetTimeFromString($) {
my ($timeStr) = @_;

eval {
use Time::Local;
if($timeStr =~ m/^(\d{4})-(\d{2})-(\d{2}) ([0-2]\d):([0-5]\d):([0-5]\d)$/) {
return timelocal($6, $5, $4, $3, $2 - 1, $1 - 1900);
}
}
}

# Berechnet von einem Start Datum aus, wieviel Tage und Wochen vergangen sind.
# Author : TeeVau (fhem@622mbit.de)
# Aufruf : printDateDiff("2015-07-02 15:05:36") oder printDateDiff("2015-07-02 15:05:36", "2015-07-12 16:02:01")
# Param 1: Start Datum.
# Param 2: Optional: End Datum. Wenn nicht angegeben wird das aktuelle genommen.
# Return : <1-12> Woche[n], <> Tag[en]
sub printDateDiff($;$) {
  my($from, $to) = @_;
  my $logTxt = "";
  my $return = undef;
  $to = TimeNow() if (!defined($to));   #Ist keine "bis" Zeit angegeben verwende "jetzt"
 
  #Umwandeln in Epoche in die Sekunden subtrahieren
  my $diff = GetTimeFromString($to) - GetTimeFromString($from);
 
  #http://wiki.selfhtml.org/wiki/Perl/Funktionen_für_Datum_und_Uhrzeit
  my $Wochen = int($diff / (7 * 24 * 3600));
  $diff %= (7 * 24 * 3600);
  my $Tage = int($diff / (24 * 3600));
  $diff %= (24 * 3600);
 
  if ($Wochen != 0) {
    $return .= "$Wochen ";      #Wert
    if ($Wochen == 1) {$return .= "Woche"} else {$return .= "Wochen"}     #Text
  }
 
  if ($Tage != 0) {
    $return .= "$Tage ";        #Wert
    if ($Tage == 1) {$return .= "Tag"} else {$return .= "Tagen"}          #Text
  }
 
  if ($Tage == 0 && $Wochen == 0) { $return .= "Heute"; }

  return $return;
}



Mit printDateDiff() lasse ich mir dann Ausgeben wieviel Tage bzw. Wochen etwas her ist.

Das ganze sieht dann in der DEF so aus:
aq_wz_ww:,<>,<setWW>,<{printDateDiff(ReadingsTimestamp($DEVICE,"Wasserwechsel",""))}@reading>

Und ergibt im Ganzen das angehängte Bild.
FHEM 5.8 dev (virtualisiert) / FBF 7390 (CUL 868MHz V 1.51 / panStick (AVR1))
FS20: fs20di,fs20pira,fs20sm8,fs20st2,fs20tfk,fs20ue1,fs20ws1
panStamp (AVR1): RGB Multi von ext23, 1W-DSxxxx, I/O Sketch, Spritzpumpe
Multimedia: Panasonic TV (VIERA), Kodi, Yamaha RX-V781, LMS
Sonstiges: XiaomiFlowerSen

justme1968

damit longpoll geht musst du den namen des readings angeben (nicht das wort reading):aq_wz_ww:,<>,<setWW>,<{printDateDiff(ReadingsTimestamp($DEVICE,"Wasserwechsel",""))}@Wasserwechsel>

zu 2: geht es jetzt um state oder um status?

gruss
  andre
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

ext23

Ach ich hatte das Device hinter dem @, ok aber auch mit dem reading geht bei mir das longpoll nicht. Also so habe ich das jetzt:
<{ReadingsTimestamp('sz_Giessanlage','CommandAccepted','error')}@CommandAccepted>

Es geht um beides, also wenn der state=off ist UND der status=voll dann soll die Gießkanne, also das Icon beim Drücken eine Aktion on-for-timer ausführen. Wenn state=off und status=leer dann soll nichts passieren und wenn state=on dann soll ein set off als command hinterlegt sein. So war mein Plan. Ich möchte halt vermeiden das jemand die Gießanlage aktiviert obwohl die Tonne leer ist.
Das reading "state" kommt von der HM-Steckdose, das reading "status" vom AVR-NET-IO der wiederum den Füllstand der Tonne dort wiederspiegelt.

Gruß
Daniel
HM, KNX, FS20, 1-Wire, PanStamp, AVR-NET-IO, EM1000EM, PCA301, EC3000, HM-LAN, CUL868, RFXtrx433, LGW, DMX @Ubuntu-Server (Hauptsystem) & Raspberry Pi (Satellit)

justme1968

erzeugt das Reading ein event um event monitor?

wenn du das kommando von zwei readings abhäng machen willst dann brauchst du die variante mit perl code  {...}

wenn du auch dafür eine longpoll aktualisierung willst musst du das zusammenbauen der bedingung aber in ein notify auslagern und nur das ergebnis der verknüpfung in der readingsGroup auswerten.

gruß
  andre
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

ulli

Weiß wer warum folgendes readingsGroup nicht aktualisiert wird durch einen LongPoll?

define rg_Raumklima readingsGroup <Raum>,<Status>,<Mode>,<Soll-Temp>,<nextUpdate>,<Ist-Temp>,<Ist-Feuchtigkeit>,<Taupunkt>,<Battery>,<Off>,<On> \
Heizung:state,<>,<>,<>,<>,<>,<>,<>,<{"%temp_temperature_min%set+Heizung+off"}@state>,<{"%sani_heating_timer%set+Heizung+on"}@state> \
.._Heating:state,setMode@{$DEVICE."Valve"},setTemp@{$DEVICE."Valve"},nextUpdate@{$DEVICE."Control"},!temperature@!{$DEVICE."_Climate"},!humidity@!{$DEVICE."_Climate"},!dewpoint@!{$DEVICE."_Climate"},!battery@!{$DEVICE."_Climate"},<{"%temp_temperature_min%set+$DEVICE+off"}@state>,<{"%sani_heating_timer%set+$DEVICE+on"}@state>
attr rg_Raumklima commands { 'setMode' => 'setMode:' }
attr rg_Raumklima mapping { 'WZ_Heating' => 'Wohnzimmer', 'SZ_Heating' => 'Schlafzimmer', 'Heizung' => 'Heizung' }
attr rg_Raumklima nameStyle style='text-align:left;;'
attr rg_Raumklima valueFormat {'temperature' => "%.0f °C", 'setTemp' => "%.0f °C", 'humidity' =>"%.0f %%" , 'nextUpdate' => '{myTimeTillUpdate($VALUE,"")}'}
attr rg_Raumklima valueStyle {myReadingsGroupClimateValueStyle($DEVICE,$READING,$VALUE)}
attr rg_Raumklima valueIcon { state => '%devStateIcon', 'battery.ok' => 'batterie@lightgreen', 'battery.low' => 'batterie@red' }
attr rg_Raumklima noheading 1
attr rg_Raumklima group Raumklima


Der Status der Devices wird einzeln in FHEM über einen LongPoll aktualisiert aber im readingsGroup Device nicht...
Was mache ich denn falsch?

ext23

Zitat von: justme1968 am 07 Juli 2015, 22:34:37
erzeugt das Reading ein event um event monitor?

wenn du das kommando von zwei readings abhäng machen willst dann brauchst du die variante mit perl code  {...}

wenn du auch dafür eine longpoll aktualisierung willst musst du das zusammenbauen der bedingung aber in ein notify auslagern und nur das ergebnis der verknüpfung in der readingsGroup auswerten.

Das erzeugt vermutlich kein event nein, aber gut, ich muss mir da was anderes einfallen lassen, die Zeiten sind nicht das was ich brauche, das ist mir zu unsicher. Ich pack das erst mal nach hinten in die queue. Dann schau ich mir mal die funktion oben von TeeVau an, das brauche ich dazu nämlich auch, sieht besser aus als die plumpe Timestamp.

Ja sind zwei readings, ok also perl. Longpoll brauch ich auch, weil sich der status der Tonne ja ändern kann im laufe der Zeit und da muss der ja sofort drauf reagieren und das commando unterbinden. Dann muss ich mir das mit dem Notify mal anschauen, dann werd ich das so machen. Also notify -> Bedingung -> Ergebnis in eine Variable -> die Variable dann auswerten. Gut ich versuch das mal so.

Dank dir.

Gruß
Daniel
HM, KNX, FS20, 1-Wire, PanStamp, AVR-NET-IO, EM1000EM, PCA301, EC3000, HM-LAN, CUL868, RFXtrx433, LGW, DMX @Ubuntu-Server (Hauptsystem) & Raspberry Pi (Satellit)

TeeVau

Hallo Daniel,

nur zur Info: Je nachdem wie wichtig dir die Genauigkeit der Zeitangabe ist, musst du an meiner Funktion ggf. noch einmal Hand anlegen. Es ist z.B. so, dass erst dann "1 Tag" ausgegeben wird, wenn wirklich 24 Stunden vorbei sind. Alles unter 24 Stunden wird wiederum als "heute" ausgegeben.
Für meinen Anwendungsfall reicht das aus. Ich verwende es als "Logbuch" für diverse Parameter der zwei Aquarien. Die Zeitangabe brauche ich in diesem Fall nicht so akkurat. Ein paar Stunden Toleranz sind da akzeptabel.

@André
Danke für den Hinweis, jetzt funktioniert es (Hab mich schon gewundert über die Syntax. @reading kam mir irgendwie so komisch vor vor;-) )
FHEM 5.8 dev (virtualisiert) / FBF 7390 (CUL 868MHz V 1.51 / panStick (AVR1))
FS20: fs20di,fs20pira,fs20sm8,fs20st2,fs20tfk,fs20ue1,fs20ws1
panStamp (AVR1): RGB Multi von ext23, 1W-DSxxxx, I/O Sketch, Spritzpumpe
Multimedia: Panasonic TV (VIERA), Kodi, Yamaha RX-V781, LMS
Sonstiges: XiaomiFlowerSen