Alle Namen der setList-Einträge eines MQTT2_DEVICE in einem Array ?

Begonnen von TomLee, 18 Dezember 2021, 21:02:07

Vorheriges Thema - Nächstes Thema

TomLee

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.

Beta-User

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).
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: ZigBee2mqtt, MiLight@ESP-GW, BT@OpenMQTTGw | ZWave | SIGNALduino | MapleCUN | RHASSPY
svn: u.a Weekday-&RandomTimer, Twilight,  div. attrTemplate-files, MySensors

TomLee

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&auml;;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&uuml;;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&auml;;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&uuml;;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

Beta-User

Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: ZigBee2mqtt, MiLight@ESP-GW, BT@OpenMQTTGw | ZWave | SIGNALduino | MapleCUN | RHASSPY
svn: u.a Weekday-&RandomTimer, Twilight,  div. attrTemplate-files, MySensors

TomLee

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

Beta-User

Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: ZigBee2mqtt, MiLight@ESP-GW, BT@OpenMQTTGw | ZWave | SIGNALduino | MapleCUN | RHASSPY
svn: u.a Weekday-&RandomTimer, Twilight,  div. attrTemplate-files, MySensors

TomLee

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 ?


DeeSPe

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');
}
MAINTAINER: 22_HOMEMODE, 98_Hyperion, 98_FileLogConvert, 98_serviced

Als kleine Unterstützung für meine Programmierungen könnt ihr mir gerne einen Kaffee spendieren: https://buymeacoff.ee/DeeSPe

TomLee

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  :).

TomLee

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


TomLee

Habs, vorne ist es $name, hinten $NAME.

speech_cmnd:{'multiple,'.ReadingsVal($name,'available_cmnds','none');} {sleep 0.5;fhem("setreading $NAME $EVTPART0 $EVTPART1")}

DeeSPe

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
MAINTAINER: 22_HOMEMODE, 98_Hyperion, 98_FileLogConvert, 98_serviced

Als kleine Unterstützung für meine Programmierungen könnt ihr mir gerne einen Kaffee spendieren: https://buymeacoff.ee/DeeSPe