Hi,
wie würdet ihr das auf dem kürzesten Weg umsetzen ?
Man könnte es mit der Rückgabe von list NAME=<DEVICENAME> setList
angehen, den Namen des Devices entfernen, am Doppelpunkt splitten usw., vlt. aber auch mit einer ganz anderen, einfacheren Variante ?
Gruß
Thomas
edit:
Ok, die Frage betrifft nicht nur MQTT2_DEVICE kommt mir im nachhinein, ich verschieb auch gerne, wohin auch immer.
getAllSets(<device>) in eine Variable holen, am Leerzeichen splitten, Arrayelemente am Doppelpunkt splitten und jeweils den ersten Teil behalten.
Alles klar?
(Ist völlig unabhängig von M2D).
Elegant und einfach gelöst empfind ich es nicht, aber es tut erstmal was ich wollte, ich erhalte ein Array mit den settern:
{my $v=getAllSets('MQTT2_v1_eg');;my @d = split '\s',$v;;my @z;;for (@d){my @t=split ':',$_;; push @z,$t[0]};;print @z;;}
Und mit nur genau dem Device mit dem ich das bis jetzt testete gibts eine Meldung im Log:
2021.12.19 12:09:08 1: PERL WARNING: Use of uninitialized value $z[0] in print at (eval 1083118) line 1.
2021.12.19 12:09:08 3: eval: ReadingsVal($name,'zones',0)
chargefan_powerlocatepausespotstartstopget_destgotomapreset_consumablezonex_raw_payloadpctattrTemplate
Ich kann alle möglichen anderen MQTT2_DEVICE-Gerätenamen angeben, ich bekomme immer nur den Inhalt des Array im Log zurück, nur mit diesem Device nicht:
defmod MQTT2_v1_eg MQTT2_DEVICE rockrobo
attr MQTT2_v1_eg alexaName fernando
attr MQTT2_v1_eg devicetopic valetudo/rockrobo
attr MQTT2_v1_eg event-on-change-reading .*
attr MQTT2_v1_eg event-on-update-reading pct
attr MQTT2_v1_eg eventMap { dev=>{ 'pct: 0'=>'pct: Fruehstuecksraum', 'pct: 1'=>'pct: Kueche','pct: 0'=>'pct: Flur', 'pct: 1'=>'pct: Hinten','pct: 9'=>'pct: blibla' } }
attr MQTT2_v1_eg genericDeviceType blind
attr MQTT2_v1_eg icon batterie
attr MQTT2_v1_eg jsonMap battery_level:batteryPercent
attr MQTT2_v1_eg model roborockRE
attr MQTT2_v1_eg readingList homeassistant/vacuum/valetudo_rockrobo/config:.* {}\
$DEVICETOPIC/state:.* { json2nameValue($EVENT) }\
$DEVICETOPIC/attributes:.* { json2nameValue($EVENT) }\
$DEVICETOPIC/map_data:.* {}\
$DEVICETOPIC/command_status:.* { json2nameValue($EVENT) }\
$DEVICETOPIC/destinations:.* { valetudoREdest($EVENT) }
attr MQTT2_v1_eg room EG,MQTT2_DEVICE
attr MQTT2_v1_eg setList charge:noArg $DEVICETOPIC/command return_to_base\
fan_power:whisper,min,medium,high,max,mop $DEVICETOPIC/set_fan_speed $EVTPART1\
locate:noArg $DEVICETOPIC/command locate\
pause:noArg $DEVICETOPIC/command pause\
spot:noArg $DEVICETOPIC/command clean_spot\
start:noArg $DEVICETOPIC/command start\
stop:noArg $DEVICETOPIC/command stop\
get_dest:noArg { $DEVICETOPIC.valetudoRE($EVENT) }\
goto:textField { $DEVICETOPIC.valetudoRE($EVENT) }\
map:textField { $DEVICETOPIC.valetudoRE($EVENT) }\
reset_consumable:main,side,filter,sensor { $DEVICETOPIC.valetudoRE($EVENT) }\
zone:{ReadingsVal($name,'zones',0)} { $DEVICETOPIC.valetudoRE($EVENT) }\
x_raw_payload:textField { $DEVICETOPIC.valetudoRE($EVENT)}\
pct:slider,0,1,10,1 {my $c = 'zone';;my %pct2cmnd = ('0' => "pause",'1' => "$c Fruehstuecksraum",'2' => "$c Kueche",'3' => "$c Flur",'4' => "$c Hinten",'5' => "$c Alles",'6' => "charge",'7'=> "start",'8'=> "$c Tisch2",'9'=> "$c blibla");;my $command = $pct2cmnd{$EVTPART1};;Debug $EVTPART1;;return if !$command;;return fhem("set $NAME $command;;setreading $NAME pct $EVTPART1");;}
attr MQTT2_v1_eg setStateList charge fan_power get_dest goto locate map pause reset_consumable spot start stop zone x_raw_payload
attr MQTT2_v1_eg stateFormat {my $s = ReadingsVal($name,'state',0);;\
my $mb = ReadingsVal($name,'mainBrush',0);;\
my $sb = ReadingsVal($name,'sideBrush',0);;\
my $f = ReadingsVal($name,'filter',0);;\
my $ss = ReadingsVal($name,'sensor',0);;\
my $bp = ReadingsVal($name,'battery_level',0);;\
my $lc = strftime("%A %d.%m.%y-%T", localtime(ReadingsNum($name,'last_bin_out',0)/1000));;;;\
"<table>\
<tr>\
<th></th>\
<th colspan='2'>Sauger</th>\
<th colspan='2'>Akku</th>\
</tr>\
<tr style='border-bottom-style: solid;;'>\
<th align='left'>Status</th>\
<td colspan='2'>$s</td>\
<td colspan='2'>$bp</td>\
</tr>\
<tr>\
<td></td>\
<th colspan='4'>Staubbehä;lter</th>\
</tr>\
<tr style='border-bottom-style: solid;;'>\
<th align='left'>Letzte Reinigung</th>\
<td colspan='4'>$lc</td>\
</tr>\
<tr>\
<th></th>\
<th>Hauptbü;rste</th>\
<th>Seitenbürste</th>\
<th>Filter</th>\
<th>Sensorreinigung</th>\
</tr>\
<tr style='border-bottom-style: solid;;'>\
<th align='left'>verbleibende Zeiten</th>\
<td>$mb h</td>\
<td>$sb h</td>\
<td>$f h</td>\
<td>$ss h</td>\
</tr>\
</table>\
"}
attr MQTT2_v1_eg timestamp-on-change-reading .*
attr MQTT2_v1_eg userReadings autoReturn:valetudo_state_name:.Idle {fhem("sleep $name:bin_in_time:.0 waitbin;;set $name charge");;return 'return'},
setstate MQTT2_v1_eg <table>\
<tr>\
<th></th>\
<th colspan='2'>Sauger</th>\
<th colspan='2'>Akku</th>\
</tr>\
<tr style='border-bottom-style: solid;;'>\
<th align='left'>Status</th>\
<td colspan='2'>docked</td>\
<td colspan='2'>100</td>\
</tr>\
<tr>\
<td></td>\
<th colspan='4'>Staubbehä;lter</th>\
</tr>\
<tr style='border-bottom-style: solid;;'>\
<th align='left'>Letzte Reinigung</th>\
<td colspan='4'>Donnerstag 11.11.21-18:55:34</td>\
</tr>\
<tr>\
<th></th>\
<th>Hauptbü;rste</th>\
<th>Seitenbürste</th>\
<th>Filter</th>\
<th>Sensorreinigung</th>\
</tr>\
<tr style='border-bottom-style: solid;;'>\
<th align='left'>verbleibende Zeiten</th>\
<td>181.1 h</td>\
<td>81.1 h</td>\
<td>31.1 h</td>\
<td>22.1 h</td>\
</tr>\
</table>\
setstate MQTT2_v1_eg 2021-12-15 18:13:36 IODev MQTT2_Server
setstate MQTT2_v1_eg 2021-09-26 09:48:53 autoReturn return
setstate MQTT2_v1_eg 2021-12-08 12:44:53 battery_level 100
setstate MQTT2_v1_eg 2021-12-08 12:33:12 bin_in_time 1762
setstate MQTT2_v1_eg 2021-12-08 12:33:12 cleanArea 6564.3
setstate MQTT2_v1_eg 2021-12-08 12:33:12 cleanCount 289
setstate MQTT2_v1_eg 2021-12-08 12:14:33 cleanTime 118.8
setstate MQTT2_v1_eg 2021-12-08 12:28:23 command zoned_cleanup
setstate MQTT2_v1_eg 2021-12-08 12:32:49 currentCleanArea 5.6
setstate MQTT2_v1_eg 2021-12-08 12:33:12 currentCleanTime 4.6
setstate MQTT2_v1_eg 2021-12-06 20:20:44 error Unable to reach vacuum, no response for message
setstate MQTT2_v1_eg 2021-10-22 11:56:36 errorCode 3
setstate MQTT2_v1_eg 2021-09-25 22:23:56 fan_speed high
setstate MQTT2_v1_eg 2021-12-08 12:33:12 filter 31.1
setstate MQTT2_v1_eg 2021-09-25 22:23:56 last_bin_full -1
setstate MQTT2_v1_eg 2021-11-11 18:55:33 last_bin_out 1636653334678
setstate MQTT2_v1_eg 2021-11-24 15:13:38 last_loaded_map_date 1637763157981
setstate MQTT2_v1_eg 2021-11-24 15:13:38 last_loaded_map_name Test
setstate MQTT2_v1_eg 2021-12-08 12:14:33 last_run_stats_area 5.6
setstate MQTT2_v1_eg 2021-12-08 12:33:12 last_run_stats_duration 276
setstate MQTT2_v1_eg 2021-12-08 12:33:12 last_run_stats_endTime 1638963179000
setstate MQTT2_v1_eg 2021-09-25 22:23:56 last_run_stats_errorCode 0
setstate MQTT2_v1_eg 2021-09-25 22:23:56 last_run_stats_errorDescription No error
setstate MQTT2_v1_eg 2021-12-08 12:14:33 last_run_stats_finishedFlag true
setstate MQTT2_v1_eg 2021-12-08 12:33:12 last_run_stats_startTime 1638962903000
setstate MQTT2_v1_eg 2021-12-08 12:33:12 mainBrush 181.1
setstate MQTT2_v1_eg 2021-09-25 22:23:35 message ok
setstate MQTT2_v1_eg 2021-09-25 22:25:00 message_1 ok
setstate MQTT2_v1_eg 2021-12-04 14:50:16 pct 9
setstate MQTT2_v1_eg 2021-12-08 12:14:33 sensor 22.1
setstate MQTT2_v1_eg 2021-12-08 12:33:12 sideBrush 81.1
setstate MQTT2_v1_eg 2021-12-08 12:33:24 state docked
setstate MQTT2_v1_eg 2021-12-08 12:28:23 updated 1638962902858
setstate MQTT2_v1_eg 2021-12-08 12:33:24 valetudo_state_id 8
setstate MQTT2_v1_eg 2021-12-08 12:33:24 valetudo_state_name Charging
setstate MQTT2_v1_eg 2021-12-08 12:21:39 zones Alles,Flur,Fruehstuecksraum,Hinten,Kueche,blibla
Vielleicht mal 'none' als default?
Nö.
2021.12.19 12:29:21 1: PERL WARNING: Use of uninitialized value $z[0] in print at (eval 1086423) line 1.
2021.12.19 12:29:21 3: eval: ReadingsVal($name,'zones','none')
chargefan_powerlocatepausespotstartstopget_destgotomapreset_consumablezonex_raw_payloadpctattrTemplate
return join...? Statt print.
Sry, kam mir wer dazwischen.
Ja, schon.
{my $v=getAllSets('MQTT2_v1_eg');;my @d = split '\s',$v;;my @z;;for (@d){my @t=split ':',$_;; push @z,$t[0]};;return join(",",@z);;}
->
,charge,fan_power,locate,pause,spot,start,stop,get_dest,goto,map,reset_consumable,zone,x_raw_payload,pct,attrTemplate
Damit umgeht man die Meldung, das Komma am Anfang bestätigt aber auch meine vorherige Vermutung das beim ersten Schleifendurchlauf was nicht passt, aber was ?
Was schlägst du jetzt vor ? Das Komma einfach entfernen ?
Ich habe eine etwas einfachere Lösung dafür ohne viele Zwischenvariablen:
{
return join(',', map {(split ':',$_)[0]} split '\s',getAllSets('MQTT2_v1_eg'));
}
Gruß
Dan
EDIT: Oder nur das Array:
{
return map {(split ':',$_)[0]} split '\s',getAllSets('MQTT2_v1_eg');
}
Sehr cool, Danke.
Als ich bei meinem Ansatz vor der Entscheidung stand wie ich das mit dem "iterieren" ? angehen soll kam mir auch map hoch, dachte mir aber nee, versuchste erst gar nicht, erstmal mit for, while (oder auch foreach ::)) beschäftigen, weil das mit den Schleifen hab ich bisher nicht wirklich verinnerlicht und Übung macht den Meister :).
Hey Dan,
welche Erklärung hast du dafür dass das Dialogfeld des Widget nicht kommt / aufpoppt, ich meine ich mache nichts falsch, wenn ich Werte statisch angebe passt alles ?
speech_cmnd:{'multiple-strict,'.ReadingsVal($NAME,'available_cmnds','none')} {sleep 0.5;fhem("setreading $NAME $EVTPART0 $EVTPART1")}
Im Reading available_cmnds steht:
speech_cmnd,charge,fan_power,locate,pause,spot,start,stop,get_dest,goto,map,reset_consumable,zone,x_raw_payload,pct,attrTemplate,Alles,Flur,Fruehstuecksraum,Hinten,Kueche,bliblablub
Habs, vorne ist es $name, hinten $NAME.
speech_cmnd:{'multiple,'.ReadingsVal($name,'available_cmnds','none');} {sleep 0.5;fhem("setreading $NAME $EVTPART0 $EVTPART1")}
Zitat von: TomLee am 19 Dezember 2021, 16:58:04
Habs, vorne ist es $name, hinten $NAME.
speech_cmnd:{'multiple,'.ReadingsVal($name,'available_cmnds','none');} {sleep 0.5;fhem("setreading $NAME $EVTPART0 $EVTPART1")}
Genau!
Vor diesem Problem stand ich auch letztens.
Gruß
Dan