httpmod.template: bugs, Fragen, Anregungen

Begonnen von Beta-User, 21 Februar 2019, 12:04:17

Vorheriges Thema - Nächstes Thema

Beta-User

Zitat von: yersinia am 23 März 2020, 13:43:44
Dat läuft unerwartet zufriedenstellend. Zumindest bei mir. :)
Dat war nicht unerwartet, dat war ausnahmsweise getestet und ist auch samt den ";;" bereits im svn... :P
Dat stammt aus meinem Vorschlag für einen dynamischen Tamota-Raum ("extraRooms"), siehe den "Tasmota-template-Strukur"-Thread im MQTT-Bereich ;) .

ZitatTasmota und MQTT2 sind noch Neuland für mich. Mir fehlt einen Ansatz das Ganze zu debuggen. Aber das wird hier OT. Wie oft muss man so ein Tasmota-Device neustarten? oO
Bitte dazu ggf. einen separaten Thread im MQTT-Bereich aufmachen. Für's debuggen einfach den MQTT-Verkehr mithören (rawEvents@MQTT2-SERVER, z.B.). Für Hilfe bitte ggf. ein RAW mit posten sowie ggf. die zugehörigen MQTT-Messages, falls was "verloren gegangen" sein sollte.
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files

joelinux

#106
Zitat von: yersinia am 23 März 2020, 11:37:46
Mit dem default
attr DEVICE includeMQTTDeviceMode tasmota-only
wird die devspec
TYPE=MQTT[2]?_[D]EVICE:FILTER=Version!=,TYPE=MQTT[2]?_[D]EVICE:FILTER=INFO1_Version!=

Mit dem vorgeschlagenen Geräte Filter zur Auffindung von Tasmota Geräten wird bei mir eine leere Liste zurückgegeben.

Erst nach Änderung des Filters in
TYPE=MQTT[2]?_[D]EVICE:FILTER=Version!=,TYPE=MQTT[2]?_[D]EVICE:FILTER=Version!=
erhalte ich eine Liste. Insgeamt muß ich 3 Änderungen in tasmotaupdates vornehmen.

In Userreadings

foreach my $dev (devspec2array("TYPE=MQTT[2]?_[D]EVICE:FILTER=Version!=,TYPE=MQTT[2]?_[D]EVICE:FILTER=Version!=")) {
      my $version = ReadingsVal($dev,"Version",ReadingsVal($dev,"Version","0.0.0"));;


und in stateformat

$ret .= '</b></a> | ';;
        $ret .= '<b style="color:lightgray">';;
$ret .= '<a href="http://'.ReadingsVal($dev,"IPAddress",ReadingsVal($dev,"IPAddress","0.0.0.0")).'" target="_blank">';;
$ret .= sprintf("%7s",$old);;

Ich kann mich erinnern, das Tasmota vor Version 7.x irgendwann die Readings mit INFO1_ Präfix angeliefert hatte.
Mit Version 7 (oder auch noch früher) wurde das JSON Format verändert und die INFO1 bis INFO3 Nachrichten landen ohne INFOx_ Präfix in den Readings.

Mit Version 8.2.0 sieht ein Neustart in der Tasmota Web Konsole so aus:


00:00:05 HTP: Web-Server aktiv bei tasmota-hlt333-6760 mit IP-Adresse 192.168.x.xxx
00:00:05 UPP: Multicast (wieder-)verbunden
15:39:22 MQT: Verbindungsversuch...
15:39:22 MQT: verbunden
15:39:22 MQT: tele/tasmota-hlt333/LWT = Online (beibehalten)
15:39:22 MQT: cmnd/tasmota-hlt333/POWER =
15:39:22 MQT: tele/tasmota-hlt333/INFO1 = {"Module":"Hyleton-333","Version":"8.2.0(tasmota)","FallbackTopic":"cmnd/DVES_8D5A68_fb/","GroupTopic":"cmnd/tasmotas/"}
15:39:22 MQT: tele/tasmota-hlt333/INFO2 = {"WebServerMode":"Admin","Hostname":"tasmota-hlt333-6760","IPAddress":"192.168.x.xxx"}
15:39:22 MQT: tele/tasmota-hlt333/INFO3 = {"RestartReason":"Software/System restart"}
15:39:22 MQT: stat/tasmota-hlt333/RESULT = {"POWER1":"on"}
15:39:22 MQT: stat/tasmota-hlt333/POWER1 = on
15:39:22 MQT: stat/tasmota-hlt333/RESULT = {"POWER2":"off"}
15:39:22 MQT: stat/tasmota-hlt333/POWER2 = off
15:39:22 MQT: stat/tasmota-hlt333/RESULT = {"POWER3":"on"}
15:39:22 MQT: stat/tasmota-hlt333/POWER3 = on
15:39:22 MQT: stat/tasmota-hlt333/RESULT = {"POWER4":"off"}
15:39:22 MQT: stat/tasmota-hlt333/POWER4 = off
15:39:23 UPP: Multicast (wieder-)verbunden



Im FHEM Gerät eines Tasmota Gerätes sieht es dann so aus.


define MQTT2_HLT333 MQTT2_DEVICE DVES_8D5A68
attr MQTT2_HLT333 DbLogExclude .*
attr MQTT2_HLT333 IODev MQTT2_FHEM_Server
attr MQTT2_HLT333 alexaName Aroma_Lampe
attr MQTT2_HLT333 comment Admin Info and Channel 1 for MQTT2_HLT333, see also MQTT2_HLT333_CH2, MQTT2_HLT333_CH3, and MQTT2_HLT333_USB
attr MQTT2_HLT333 devStateIcon Online:10px-kreis-gruen Offline:10px-kreis-rot
attr MQTT2_HLT333 event-on-change-reading .*
attr MQTT2_HLT333 genericDeviceType switch
attr MQTT2_HLT333 icon hue_filled_outlet
attr MQTT2_HLT333 jsonMap POWER1:state Dimmer:pct
attr MQTT2_HLT333 model tasmota_3socketUSB_channel_split
attr MQTT2_HLT333 readingList tele/tasmota-hlt333/LWT:.* LWT\
  tele/tasmota-hlt333/INFO.:.* { json2nameValue($EVENT,'',$JSONMAP) }\
  tele/tasmota-hlt333/STATE:.* { json2nameValue($EVENT,'state_',$JSONMAP) }\
  stat/tasmota-hlt333/RESULT:.* { json2nameValue($EVENT,'',$JSONMAP) }\
  stat/tasmota-hlt333/STATUS:.* { json2nameValue($EVENT,'',$JSONMAP) }\
  stat/tasmota-hlt333/POWER1:.* state\
  stat/tasmota-hlt333/POWER2:.* POWER2\
  stat/tasmota-hlt333/POWER3:.* POWER3\
  stat/tasmota-hlt333/POWER4:.* POWER4\
  cmnd/tasmota-hlt333/POWER:.* POWER\
DVES_8D5A68:stat/tasmota-hlt333/UPGRADE:.* { json2nameValue($EVENT) }
attr MQTT2_HLT333 room Arbeitszimmer
attr MQTT2_HLT333 setList off:noArg cmnd/tasmota-hlt333/POWER1 0\
  on:noArg cmnd/tasmota-hlt333/POWER1 1\
  toggle:noArg cmnd/tasmota-hlt333/POWER1 2\
  x_Reboot:noArg cmnd/tasmota-hlt333/restart 1\
  x_Status:noArg cmnd/tasmota-hlt333/Status\
  x_setOtaUrl:multiple,http://thehackbox.org/tasmota/release/tasmota-DE.bin cmnd/tasmota-hlt333/OtaUrl $EVTPART1\
  x_upgrade:noArg   cmnd/tasmota-hlt333/upgrade 1\
  x_ShowHostname:noArg cmnd/tasmota-hlt333/Backlog setoption53 1;; Status;;\
  x_DisableBlinkLED:noArg cmnd/tasmota-hlt333/Backlog LEDPower 0;; setoption31 1;; Status;;\
  x_SaveData:0,1 cmnd/tasmota-hlt333/savedata $EVTPART1\
  x_Configuration cmnd/tasmota-hlt333/$EVTPART1 $EVTPART2\
  x_RuleButton:noArg cmnd/tasmota-hlt333/rule on button1#state=3 do backlog power1 2;; power2 2;; power3 2;; power4 2 endon on button1#state=2 do backlog power1 1;; power2 1;; power3;; power4 1 endon\
  x_RuleEnable:noArg cmnd/tasmota-hlt333/Backlog setoption1 1;; setoption32 15;; rule1 1\
  x_Location:noArg cmnd/tasmota-hlt333/Backlog Latitude 51.53800;; Longitude 7.256381;; Altitude 0\
x_NTPServer:multiple,fritz.box cmnd/tasmota-hlt333/ntpserver $EVTPART1
attr MQTT2_HLT333 stateFormat LWT\
state\
<a href="http://IPAddress" target="_blank">IPAddress</a>
attr MQTT2_HLT333 userReadings formatedUptime:state_UptimeSec.* { my $m = ReadingsVal($name,"state_UptimeSec",0)/60;;;; return sprintf "0 000 00:%02d", $m if $m < 60;;;; my $h = $m / 60;;;; $m %= 60;;;; return sprintf "0 000 %02d:%02d", $h, $m if $h < 24;;;; my $d = $h / 24;;;; $h %= 24;;;; return sprintf "0 %03d %02d:%02d", $d, $h, $m if $d <365;;;; my $y = $d / 365;;;; $d %= 365;;;; return sprintf "%d %03d %02d:%02d", $y, $d, $h, $m }

setstate MQTT2_HLT333 Online\
on\
<a href="http://192.168.1.206" target="_blank">192.168.x.xxx</a>
setstate MQTT2_HLT333 2020-03-21 19:40:46 FallbackTopic cmnd/DVES_8D5A68_fb/
setstate MQTT2_HLT333 2020-03-21 19:40:46 GroupTopic cmnd/tasmotas/
setstate MQTT2_HLT333 2020-03-21 19:40:46 Hostname tasmota-hlt333-6760
setstate MQTT2_HLT333 2020-03-21 19:40:46 IPAddress 192.168.x.xxx
setstate MQTT2_HLT333 2020-03-22 21:20:02 LWT Online
setstate MQTT2_HLT333 2020-03-21 19:40:46 Module Hyleton-333
setstate MQTT2_HLT333 2020-03-21 19:39:50 OtaUrl http://thehackbox.org/tasmota/release/tasmota-DE.bin
setstate MQTT2_HLT333 2020-03-22 21:20:02 POWER
setstate MQTT2_HLT333 2020-03-21 19:40:46 POWER2 off
setstate MQTT2_HLT333 2020-03-21 19:40:47 POWER3 on
setstate MQTT2_HLT333 2020-03-21 19:40:47 POWER4 off
setstate MQTT2_HLT333 2020-03-21 17:28:05 Restart Restarting
setstate MQTT2_HLT333 2020-03-21 19:40:46 RestartReason Software/System restart
setstate MQTT2_HLT333 2020-03-21 17:28:06 SaveData on
setstate MQTT2_HLT333 2020-03-21 17:28:06 SetOption26 on
setstate MQTT2_HLT333 2020-03-21 17:28:05 StateText1 off
setstate MQTT2_HLT333 2020-03-21 17:28:05 StateText2 on
setstate MQTT2_HLT333 2020-03-21 17:28:05 StateText3 toggle
setstate MQTT2_HLT333 2020-03-21 17:28:05 StateText4 hold
setstate MQTT2_HLT333 2020-03-21 17:28:05 Status_ButtonRetain 0
setstate MQTT2_HLT333 2020-03-21 17:28:05 Status_ButtonTopic 0
setstate MQTT2_HLT333 2020-03-21 17:28:05 Status_FriendlyName_1 Alexa-Arbeit-schwarz
setstate MQTT2_HLT333 2020-03-21 17:28:05 Status_FriendlyName_2 Arbeit-7
setstate MQTT2_HLT333 2020-03-21 17:28:05 Status_FriendlyName_3 Arbeit-8
setstate MQTT2_HLT333 2020-03-21 17:28:05 Status_FriendlyName_4 Arbeit-9
setstate MQTT2_HLT333 2020-03-21 17:28:05 Status_LedMask FFFF
setstate MQTT2_HLT333 2020-03-21 17:28:05 Status_LedState 1
setstate MQTT2_HLT333 2020-03-21 17:28:05 Status_Module 0
setstate MQTT2_HLT333 2020-03-21 17:28:05 Status_Power 5
setstate MQTT2_HLT333 2020-03-21 17:28:05 Status_PowerOnState 3
setstate MQTT2_HLT333 2020-03-21 17:28:05 Status_PowerRetain 0
setstate MQTT2_HLT333 2020-03-21 17:28:05 Status_SaveData 1
setstate MQTT2_HLT333 2020-03-21 17:28:05 Status_SaveState 1
setstate MQTT2_HLT333 2020-03-21 17:28:05 Status_SensorRetain 0
setstate MQTT2_HLT333 2020-03-21 17:28:05 Status_SwitchMode_1 0
setstate MQTT2_HLT333 2020-03-21 17:28:05 Status_SwitchMode_2 0
setstate MQTT2_HLT333 2020-03-21 17:28:05 Status_SwitchMode_3 0
setstate MQTT2_HLT333 2020-03-21 17:28:05 Status_SwitchMode_4 0
setstate MQTT2_HLT333 2020-03-21 17:28:05 Status_SwitchMode_5 0
setstate MQTT2_HLT333 2020-03-21 17:28:05 Status_SwitchMode_6 0
setstate MQTT2_HLT333 2020-03-21 17:28:05 Status_SwitchMode_7 0
setstate MQTT2_HLT333 2020-03-21 17:28:05 Status_SwitchRetain 0
setstate MQTT2_HLT333 2020-03-21 17:28:05 Status_SwitchTopic 0
setstate MQTT2_HLT333 2020-03-21 17:28:05 Status_Topic tasmota-hlt333
setstate MQTT2_HLT333 2020-03-21 19:40:30 Upgrade Successful. Restarting
setstate MQTT2_HLT333 2020-03-21 19:40:46 Version 8.2.0(tasmota)
setstate MQTT2_HLT333 2020-03-21 19:40:46 WebServerMode Admin
setstate MQTT2_HLT333 2020-03-21 17:28:03 associatedWith MQTT2_HLT333_CH2,MQTT2_HLT333_CH3,MQTT2_HLT333_USB
setstate MQTT2_HLT333 2020-03-23 15:22:28 formatedUptime 0 001 19:41
setstate MQTT2_HLT333 2020-03-21 19:40:46 state on
setstate MQTT2_HLT333 2020-03-23 15:22:28 state_Heap 25
setstate MQTT2_HLT333 2020-03-23 15:22:28 state_LoadAvg 19
setstate MQTT2_HLT333 2020-03-23 15:22:28 state_MqttCount 6
setstate MQTT2_HLT333 2020-03-23 15:22:28 state_POWER2 off
setstate MQTT2_HLT333 2020-03-23 15:22:28 state_POWER3 on
setstate MQTT2_HLT333 2020-03-23 15:22:28 state_POWER4 off
setstate MQTT2_HLT333 2020-03-23 15:22:28 state_Sleep 50
setstate MQTT2_HLT333 2020-03-23 15:22:28 state_SleepMode Dynamic
setstate MQTT2_HLT333 2020-03-23 15:22:28 state_Time 2020-03-23T15:22:27
setstate MQTT2_HLT333 2020-03-23 15:22:28 state_Uptime 1T19:41:50
setstate MQTT2_HLT333 2020-03-23 15:22:28 state_UptimeSec 157310
setstate MQTT2_HLT333 2020-03-23 15:22:28 state_Wifi_AP 1
setstate MQTT2_HLT333 2020-03-23 15:22:28 state_Wifi_BSSId F0:B0:14:5C:7B:10
setstate MQTT2_HLT333 2020-03-23 15:22:28 state_Wifi_Channel 6
setstate MQTT2_HLT333 2020-03-23 15:22:28 state_Wifi_Downtime 0T00:00:13
setstate MQTT2_HLT333 2020-03-23 15:22:28 state_Wifi_LinkCount 2
setstate MQTT2_HLT333 2020-03-23 15:22:28 state_Wifi_/RSSI 70
setstate MQTT2_HLT333 2020-03-23 15:22:28 state_Wifi_SSId Snoopy
setstate MQTT2_HLT333 2020-03-23 15:22:28 state_Wifi_Signal -65
setstate MQTT2_HLT333 2020-03-23 15:22:28 state_state on
setstate MQTT2_HLT333 2020-03-22 21:20:13 subscriptions cmnd/DVES_8D5A68_fb/# cmnd/tasmota-hlt333/# cmnd/tasmotas/#


Mit freundlichem Gruß

joelinux
FHem on RPi2 Buster, Duofern Rollladen, ZWave Rolllade + Steckdosen, ZigBee (Philips, Tradfri), Tasmota (diverse Steckdosen, GU10 und E14 LSC Leds von Action, Sonoff RF Bridge), InterTechno Dimmer Steckdose ITLR-200

Beta-User

...es wäre nett, wenn ihr bei Kommentaren die jeweils letzte Fassung in der attrTemplate-file in Bezug nehmen könntet, dann muß ich nicht raten, worin jetzt genau die Anregung liegen soll...

Der Vorschlag für den Filter von yersinia war ja schon wieder überholt, und den "Vorteil" von Konstruktionen wie
my $version = ReadingsVal($dev,"Version",ReadingsVal($dev,"Version","0.0.0"));;
gegenüber meiner "Verschlimmbesserung"
my $version = ReadingsVal($dev,"Version",ReadingsVal($dev,"INFO1_Version","0.0.0"));;muß mir erst nochmal jemand näher erklären  :P ...

(Die Ausgangsfassung war: "my $version = ReadingsVal($dev,"INFO1_Version","0.0.0");;;;"... DIE lieferte auch bei mir kein Ergebnis 8) .)
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files

joelinux

Zitat von: Beta-User am 23 März 2020, 17:36:59
gegenüber meiner "Verschlimmbesserung"
my $version = ReadingsVal($dev,"Version",ReadingsVal($dev,"INFO1_Version","0.0.0"));;muß mir erst nochmal jemand näher erklären  :P ...

(Die Ausgangsfassung war: "my $version = ReadingsVal($dev,"INFO1_Version","0.0.0");;;;"... DIE lieferte auch bei mir kein Ergebnis 8) .)

Es hat etwas gedauert, aber jetzt dämmert es. Die Verschachtelung von ReadingsVal innerhalb einer ReadingsVal ist die elegante Lösung.
Damit sind sowohl neue Tasmota Versionen als auch ältere Tasmota Versionen erfasst.  8)

[Annahme]
Die Verschachtelung geht davon aus das entweder das Reading "Version" oder das Reading "INFO1_Version" existiert.
Es wird für beide Fälle ein verwertbares Resultat zurück geliefert.
Sollte in ungewöhnlichen Fällen sowohl Version als auch INFO1_Version existieren wird im Resultat INFO1_Version bevorzugt.

Für Kanal 'split' Geräte werden nur die Stamm Geräte in die Liste aufgenommen wenn die vorhandenen mqtt Templates weiterhin die meisten Readings in den Unter Kanälen unterdrückt. Extrem cool  8) 8)
[/Annahme]

Mit freundlichem Gruß

joelinux
FHem on RPi2 Buster, Duofern Rollladen, ZWave Rolllade + Steckdosen, ZigBee (Philips, Tradfri), Tasmota (diverse Steckdosen, GU10 und E14 LSC Leds von Action, Sonoff RF Bridge), InterTechno Dimmer Steckdose ITLR-200

Beta-User

 :) Fast...

Die "Annahmen" sind teils nicht ganz zutreffend, kurz zur Klarstellung, weil wir das ggf. an anderer Stelle wieder brauchen:
- In den Funktionen wie ReadingsVal() steht als drittes Argument immer der "fallback" => "Version" hätte Prio ;) . Steht auch so in der Doku (commandref).
- Bei "INFO._.*" geht es auch nicht um "neu" oder "alt", sondern um "autocreate" "complex" vs. "simple". Kurz war "complex" der default am MQTT2_SERVER gewesen, und man kann das heute noch generieren, wenn man complex aktiviert... (die IP-Adresse kommt über INFO2, da war also noch ein kleiner bug drin, der beim nächsten update raus sein sollte).
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files

yersinia

#110
Hallo Beta-User,

ich hab nen kleinen fix für den homematic fw check eingebaut und auf responsive Design umgestellt, sieht aus wie hier. Kannst du nochmal cross checken und -wenn du möchtest- einchecken?
#Contributed by Pfriemler & yersinia, see https://forum.fhem.de/index.php/topic,78501.msg1043080.html#msg1043080
name:hm_fw_check_v2
filter:TYPE=HTTPMOD
desc: check for homematic firmware updates; based on new link provided by Pfriemler (switch from eq-3.de to update.homematic.com)<br />Define a HTTPMOD device like <br>define hm_fw_check HTTPMOD https://update.homematic.com/firmware/api/firmware/search/DEVICE 86400<br /><a href="https://forum.fhem.de/index.php/topic,78501.msg1043080.html#msg1043080">Source: Forum</a>
order:X_01a
par:WHICHROOM;Actual room of the device, defaults to HTTPMOD; {AttrVal("DEVICE","room","HTTPMOD" )}
par:INTERVAL;Actual interval for updating, defaults to one day (86400s); {InternalVal("DEVICE","Interval",86400)}
defmod DEVICE HTTPMOD https://update.homematic.com/firmware/api/firmware/search/\DEVICE INTERVAL
attr DEVICE userattr reading01AutoNumLen reading01Name reading01RegOpt reading01Regex reading02AutoNumLen reading02Name reading02RegOpt reading02Regex readingMaxAge readingMaxAgeReplacementMode:text,reading,internal,expression,delete showNewFWOnly:yes,no
attr DEVICE do_not_notify 1
attr DEVICE enableControlSet 1
attr DEVICE icon hm_ccu
attr DEVICE reading01AutoNumLen 2
attr DEVICE reading01Name hmfw-type
attr DEVICE reading01RegOpt g
attr DEVICE reading01Regex (?i)"type":"((?:\w+[-]*){1,})
attr DEVICE reading02AutoNumLen 2
attr DEVICE reading02Name hmfw-version
attr DEVICE reading02RegOpt g
attr DEVICE reading02Regex (?si)"version":"(\d+[.]\d+[.]\d+)
attr DEVICE readingMaxAge 10
attr DEVICE readingMaxAgeReplacementMode delete
attr DEVICE room WHICHROOM
attr DEVICE showError 1
attr DEVICE showMatched 1
attr DEVICE showNewFWOnly yes
attr DEVICE stateFormat {   my $ret ="";;\
    my $lastCheck = POSIX::strftime("%d.%m. %H:%M",localtime(time_str2num(ReadingsTimestamp($name,"MATCHED_READINGS","2000-01-01 00:00:00"))));;\
my $nextCheck = POSIX::strftime("%d.%m. %H:%M",localtime(time_str2num(InternalVal($name,"TRIGGERTIME_FMT","2000-01-01 00:00:00"))));;\
my $cellstyle = "padding:3pt;;border-bottom:1px dotted lightgray;;";;\
    $ret .= '<div style="text-align:left;;">';;;;\
    $ret .= 'last <a title="eq3-downloads" href="http://www.eq-3.de/service/downloads.html">homematic</a>-fw-check => '.$lastCheck;;\
    $ret .= '<br />';;\
    my $check = ReadingsVal($name,"newFwForDevices","error => no or wrong data from eq3-server!");;\
    if($check eq "no fw-updates needed!") {\
      $ret .= '<div style="color:limegreen;;font-weight:bold;;">';;\
      $ret .= $check;;\
      $ret .= '</div>';;\
    } elsif($check eq "error => no or wrong data from eq3-server!") {\
      $ret .= '<div style="color:red;;font-weight:bold;;">';;\
      $ret .= $check;;\
      $ret .= '</div>';;\
    } else {\
$ret .= '<br /><div style="display:table;;width:100%;;">';;\
$ret .= '<div style="display:table-row;;">';;\
      $ret .= '<div style="display:table-cell;;'.$cellstyle.'width:50%;;font-weight:bold;;">device</div>';;\
  $ret .= '<div style="display:table-cell;;'.$cellstyle.'width:30%;;font-weight:bold;;">model</div>';;\
  $ret .= '<div style="display:table-cell;;'.$cellstyle.'width:10%;;font-weight:bold;;">current</div>';;\
  $ret .= '<div style="display:table-cell;;'.$cellstyle.'width:10%;;font-weight:bold;;">new</div>';;\
$ret .= '</div>';; #header\
      my @devices = split(',',$check);;\
      foreach my $devStr (@devices) {\
        #my ($dev,$md,$idx,$ofw,$nfw) = $devStr =~ m/([^\s]+)\s[(]([^\s]+)\s[(](\d+)[)]\sofw_([\d\.]+)\s=>\snfw_([\d\.]+)/;;\
my ($dev,$idx) = $devStr =~ m/([^\s]+)\s[(](\d+)[)]/;;\
my $md = ReadingsVal($name,("hmfw-type-".$idx),"?");;\
my $ofw = AttrVal($dev,"firmware","?");;\
my $nfw = ReadingsVal($name,("hmfw-version-".$idx),"none");;\
        my $fw_link = "https://ccu3-update.homematic.com/firmware/download?cmd=download&serial=0&product=".$md;;\
$ret .= '<div style="display:table-row;;">';;\
$ret .= '<div style="display:table-cell;;'.$cellstyle.'width:50%;;">';;\
        $ret .= '<a href="/fhem?detail='.$dev.'" target="_blank">';;\
$ret .= AttrVal($dev,"alias",$dev);;\
        $ret .= '</a></div>';;\
$ret .= '<div style="display:table-cell;;'.$cellstyle.'width:30%;;font-weight:bold;;color:lightgrey;;">';;\
        $ret .= $md;;\
        $ret .= '</div>';;\
$ret .= '<div style="display:table-cell;;'.$cellstyle.'width:10%;;font-weight:bold;;color:lightgrey;;">';;\
        $ret .= $ofw;;\
        $ret .= '</div>';;\
$ret .= '<div style="display:table-cell;;'.$cellstyle.'width:10%;;font-weight:bold;;color:red;;">';;\
        $ret .= '<a title="download firmware file" href="'.$fw_link.'" rel="noopener noreferrer" target="_blank" style="color:red;;">';;\
        $ret .= $nfw;;\
        $ret .= '</a></div>';;\
        $ret .= '</div>';; #row\
      }\
  $ret .= '</div>';; #table\
    }\
$ret .= "<br /><div style=\"text-align:left;;\">(next check: ".$nextCheck.")</div>";;\
    $ret .= '</div>';;\
  return $ret;;\
}
attr DEVICE userReadings newFwForDevices:MATCHED_READINGS.* {\
  my $ret = "";;\
  my $newfwonly = AttrVal($name,"showNewFWOnly","yes");;\
  if (ReadingsVal($name,"UNMATCHED_READINGS","?") eq "") {\
    my @eq3FwList = map { \
sprintf(uc(ReadingsVal($name,"hmfw-type-".$_,"?")).":".ReadingsVal($name,"hmfw-version-".$_,"?").":".$_);;\
} ReadingsVal($name,"MATCHED_READINGS","?")=~ m/hmfw-version-(\d\d)/g;;\
\
foreach my $dev (devspec2array("TYPE=CUL_HM:FILTER=DEF=......:FILTER=subType!=(virtual|)")) {\
      my $md = AttrVal($dev,"model","?");;\
      my $v = AttrVal($dev,"firmware","0.0");;\
      my ($h,$l) = split('\.',$v);;\
      foreach my $newFW (grep m/^${md}:/i,@eq3FwList) {\
my ($fwmd, $fwv, $idx) = $newFW =~ m/([^:]+):(\d+[.]\d+[.]\d+):(\d+)$/;;\
my ($fwh, $fwl) = split('\.',$fwv);;\
if(($newfwonly eq "no") || (($fwh > $h) || (($fwh == $h) && ($fwl > $l)))) {\
          $ret .= "," if($ret ne "");;\
  $ret .= $dev." (".$idx.")";;\
        }\
      }\
    }\
  } else {\
    $ret = "error => no or wrong data from eq3-server!";;\
  }\
  return ($ret eq "")?"no fw-updates needed!":$ret;;\
}
attr DEVICE webCmd reread
attr DEVICE model homematic_fw_check_v2


Weil ich gerade dabei bin, anbei noch eine Optimierung für das heizoel Device:
#Contributed by subseven & yersinia, see https://forum.fhem.de/index.php/topic,107189.msg1017754.html#msg1017754
name:fuel_oil_check
filter:TYPE=HTTPMOD
desc: checks fuel oil prices via easyoil.com<br>Define a HTTPMOD device like<br />define heizoelpreis HTTPMOD https://www.esyoil.com/preisausgabe.php?pr-unloading-points=%%ENTLADESTELLEN%%&pr-product=8&pr-payment-type=2&%%ANHAENGER%%&pr-hose-length=%%SCHLAUCHLAENGE%%&pr-app=1&pr-zip=%%PLZ%%&pr-amount=%%MENGE%%&submit= 3600<br /><a href="https://forum.fhem.de/index.php/topic,107189.msg1017754.html#msg1017754">Source: Forum</a>
order:order: 100005
par:WHICHROOM;Actual room of the device, defaults to HTTPMOD; {AttrVal("DEVICE","room","HTTPMOD" )}
par:INTERVAL;Actual interval for updating, defaults to hourly (3600s); {InternalVal("DEVICE","Interval",3600)}
defmod DEVICE HTTPMOD https://www.esyoil.com/preisausgabe.php?pr-unloading-points=%%ENTLADESTELLEN%%&pr-product=8&pr-payment-type=2&%%ANHAENGER%%&pr-hose-length=%%SCHLAUCHLAENGE%%&pr-app=1&pr-zip=%%PLZ%%&pr-amount=%%MENGE%%&submit= INTERVAL
attr DEVICE userattr reading010Name reading010OExpr reading010Regex replacement01Mode:reading,internal,text,expression,key replacement01Regex replacement01Value replacement02Mode:reading,internal,text,expression,key replacement02Regex replacement02Value replacement03Mode:reading,internal,text,expression,key replacement03Regex replacement03Value replacement04Mode:reading,internal,text,expression,key replacement04Regex replacement04Value replacement05Mode:reading,internal,text,expression,key replacement05Regex replacement05Value
attr DEVICE enableControlSet 1
attr DEVICE group Spritpeise
attr DEVICE reading010Name Heizoelpreis
attr DEVICE reading010OExpr $val =~ s/,/\./;; $val;;
attr DEVICE reading010Regex ([\d\,]+)[\s]+€
attr DEVICE replacement01Mode text
attr DEVICE replacement01Regex %%PLZ%%
attr DEVICE replacement01Value 12345
attr DEVICE replacement02Mode text
attr DEVICE replacement02Regex %%MENGE%%
attr DEVICE replacement02Value 3000
attr DEVICE replacement03Mode text
attr DEVICE replacement03Regex %%ENTLADESTELLEN%%
attr DEVICE replacement03Value 1
attr DEVICE replacement04Mode text
attr DEVICE replacement04Regex %%SCHLAUCHLAENGE%%
attr DEVICE replacement04Value 40m
attr DEVICE replacement05Mode text
attr DEVICE replacement05Regex %%ANHAENGER%%
attr DEVICE replacement05Value pr-truck-type=short_vehicle
attr DEVICE room WHICHROOM
attr DEVICE stateFormat { my $price = 0.0;;\
$price = (AttrNum($name,"replacement02Value",0)*ReadingsNum($name,"Heizoelpreis",0))/100;;\
my $ret = "<div>".ReadingsTimestamp($name,"Heizoelpreis","-");;\
$ret .= "&nbsp;;<b><a href=\"".InternalVal($name,"displayurl","https://www.esyoil.com")."\" rel=\"noopener noreferrer\" target=\"_blank\">";;\
$ret .= ReadingsVal($name,"Heizoelpreis","-");;\
$ret .= "&euro;;</a></b>/100l";;\
$ret .= "&nbsp;;(".AttrVal($name,"replacement02Value","0")."l = ";;\
$ret .= sprintf("%.2f",$price);;\
$ret .= "&euro;;)</div>";;\
return $ret;;\
}
attr DEVICE webCmd reread
attr DEVICE model fuel_oil_check


Ach, wegen des lockdowns und weil es so schön ist, hier noch eines um die a-culfw firmware version zu prüfen - wenn es dafür überhaupt Bedarf gibt (mir fehlt eine Order hier, kannst du die ergänzen?):
#Contributed by yersinia, see https://forum.fhem.de/index.php/topic,97694.msg1045829.html#msg1045829
name:aculfw_fw_check
filter:TYPE=HTTPMOD
desc: checks a-culfw firmware updates<br />Define a HTTPMOD device like<br />define aculfw_fw_check HTTPMOD https://github.com/heliflieger/a-culfw/blob/master/CHANGELOG 86400<br /><a href="https://forum.fhem.de/index.php/topic,97694.msg1045829.html#msg1045829">Source: Forum</a>
order:order: XXXXX
par:WHICHROOM;Actual room of the device, defaults to HTTPMOD; {AttrVal("DEVICE","room","HTTPMOD" )}
par:INTERVAL;Actual interval for updating, defaults to daily (86400s); {InternalVal("DEVICE","Interval",86400)}
defmod DEVICE HTTPMOD https://github.com/heliflieger/a-culfw/blob/master/CHANGELOG INTERVAL
attr DEVICE userattr reading01Name reading01Regex updatableDevicesMode:onlyUpdatable,all
attr DEVICE do_not_notify 1
attr DEVICE enableControlSet 1
attr DEVICE event-on-update-reading LAST_ERROR,MATCHED_READINGS
attr DEVICE handleRedirects 1
attr DEVICE icon cul_usb
attr DEVICE reading01Name latestVersion
attr DEVICE reading01Regex \#\#\# ([\d]\.[\d]{2}\.[\d]{2})
attr DEVICE room WHICHROOM
attr DEVICE showError 1
attr DEVICE showMatched 1
attr DEVICE stateFormat { my $ret ="";;\
my $lastCheck = POSIX::strftime("%d.%m. %H:%M",localtime(time_str2num(ReadingsTimestamp($name,"MATCHED_READINGS","2000-01-01 00:00:00"))));;\
my $nextCheck = POSIX::strftime("%d.%m. %H:%M",localtime(time_str2num(InternalVal($name,"TRIGGERTIME_FMT","2000-01-01 00:00:00"))));;\
my $cellstyle = "padding:3pt;;border-bottom:1px dotted lightgray;;";;\
$ret .= '<div style="text-align:left;;">';;\
$ret .= 'last <a href="https://github.com/heliflieger/a-culfw" title="aculfw" rel="noopener noreferrer" target="_blank">a-culfw</a> version check => '.$lastCheck;;\
$ret .= '<br />';;\
    my $check = ReadingsVal($name,"updatableDevices","error => no or wrong data from server!");;\
    if($check eq "no updates needed!") {\
      $ret .= '<div style="color:limegreen;;font-weight:bold;;">';;\
      $ret .= $check;;\
      $ret .= '</div>';;\
    } elsif($check eq "error => no or wrong data from server!") {\
      $ret .= '<div style="color:limegreen;;font-weight:bold;;">';;\
      $ret .= $check;;\
      $ret .= '</div>';;\
    } else {\
      my @devices = split(',',$check);;\
  $ret .= '<br /><div style="display:table;;width:80%;;">';;\
$ret .= '<div style="display:table-row;;">';;\
$ret .= '<div style="display:table-cell;;'.$cellstyle.'width:60%;;font-weight:bold;;">device</div>';;\
  $ret .= '<div style="display:table-cell;;'.$cellstyle.'width:20%;;font-weight:bold;;">current</div>';;\
  $ret .= '<div style="display:table-cell;;'.$cellstyle.'width:20%;;font-weight:bold;;">new</div>';;\
$ret .= '</div>';; #header\
      foreach my $devStr (@devices) {\
        my ($dev,$old,$new) = $devStr =~ m/^([^\s]+)\s\(([^\s]+)\s\|\s([^\)]+)\)$/;;\
$ret .= '<div style="display:table-row;;">';;\
$ret .= '<div style="display:table-cell;;'.$cellstyle.'width:60%;;">';;\
$ret .= '<a href="/fhem?detail='.$dev.'" title="'.$dev.' ('.$old.')">';;\
$ret .= AttrVal($dev,"alias",$dev);;\
$ret .= '</a></div>';;\
$ret .= '<div style="display:table-cell;;'.$cellstyle.'width:20%;;font-weight:bold;;">';;\
$ret .= '<a href="https://github.com/heliflieger/a-culfw/releases/tag/'.$old.'" title="a-culfw '.$old.'" rel="noopener noreferrer" target="_blank" style="color:lightgray;;">';;\
$ret .= $old;;\
        $ret .= '</a></div>';;\
$ret .= '<div style="display:table-cell;;'.$cellstyle.'width:20%;;font-weight:bold;;">';;\
        $ret .= '<a href="https://github.com/heliflieger/a-culfw/releases/tag/'.$new.'" title="a-culfw '.$new.'" rel="noopener noreferrer" target="_blank" style="color:red;;">';;\
        $ret .= $new;;\
        $ret .= '</a></div>';;\
$ret .= '</div>';; #row\
      }\
  $ret .= '</div>';; #table\
    }\
$ret .= "<br /><div style=\"text-align:left;;\">(next check: ".$nextCheck.")</div>";;\
$ret .= '</div>';;\
  return $ret;;\
}
attr DEVICE updatableDevicesMode onlyUpdatable
attr DEVICE userReadings updatableDevices {\
  my $ret = "";;\
  my $updateall = AttrVal($name,"updatableDevicesMode","");;\
  if (ReadingsVal($name,"MATCHED_READINGS","") eq "") {\
    $ret = "error => no or wrong data from server!";;\
  } else {\
    my $VERSION = ReadingsVal($name,"latestVersion","unknown");;\
    foreach my $dev (devspec2array("TYPE=CUL")) {\
      my $version = InternalVal($dev,"VERSION","unknown");;\
      $version =~ m/([\d]\.[\d]{2}\.[\d]{2})/;;\
      $version = $1;;\
      if(($updateall eq "all") || ($version ne $VERSION)) {\
        $ret .= "," if($ret ne "");;\
        $ret .= $dev." (".$version." | ".$VERSION.")";;\
      }\
    }\
  }\
  return ($ret eq "")?"no updates needed!":$ret;;\
}
attr DEVICE webCmd reread
attr DEVICE model aculfw_fw_check

viele Grüße, yersinia
----
FHEM 6.3 (SVN) on RPi 4B with RasPi OS Bullseye (perl 5.32.1) | FTUI
nanoCUL->2x868(1x ser2net)@tsculfw, 1x433@Sduino | MQTT2 | Tasmota | ESPEasy
VCCU->14xSEC-SCo, 7xCC-RT-DN, 5xLC-Bl1PBU-FM, 3xTC-IT-WM-W-EU, 1xPB-2-WM55, 1xLC-Sw1PBU-FM, 1xES-PMSw1-Pl

Beta-User

Ohne crosscheck eingecheckt... wird schon passen :P .
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files

yersinia

viele Grüße, yersinia
----
FHEM 6.3 (SVN) on RPi 4B with RasPi OS Bullseye (perl 5.32.1) | FTUI
nanoCUL->2x868(1x ser2net)@tsculfw, 1x433@Sduino | MQTT2 | Tasmota | ESPEasy
VCCU->14xSEC-SCo, 7xCC-RT-DN, 5xLC-Bl1PBU-FM, 3xTC-IT-WM-W-EU, 1xPB-2-WM55, 1xLC-Sw1PBU-FM, 1xES-PMSw1-Pl

Beta-User

Ups, da waren die Änderungen in der falschen Datei ::) . Danke für den Hinweis, jetzt sind die neuen Versionen wirklich im svn.
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files

yersinia

#114
Zitat von: Beta-User am 22 April 2020, 17:56:43wird schon passen :P .
Jo, und das
attr DEVICE DbLogExclude .*
attr DEVICE alignTime 14:04

in allen Templates habe ich mehrfach übersehen - und erst gefunden als es im svn war. *facepalm*
Ich hab das oben korrigiert, sollte mMn nicht allzu große Auswirkungen haben bei den Usern. *pray*
Könntest du, wenne Zeit hast, das noch rausnehmen? *hundeblick* gerne auch per C&P
viele Grüße, yersinia
----
FHEM 6.3 (SVN) on RPi 4B with RasPi OS Bullseye (perl 5.32.1) | FTUI
nanoCUL->2x868(1x ser2net)@tsculfw, 1x433@Sduino | MQTT2 | Tasmota | ESPEasy
VCCU->14xSEC-SCo, 7xCC-RT-DN, 5xLC-Bl1PBU-FM, 3xTC-IT-WM-W-EU, 1xPB-2-WM55, 1xLC-Sw1PBU-FM, 1xES-PMSw1-Pl

Beta-User

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

Schlimbo

Zitat von: SirUli am 04 Mai 2019, 13:38:54
Merci und ich lege gleich nochmal nach. Basierend auf Artikeln in meinem Blog, hier noch für die HP Printer ne Erweiterung und der Brother Scanner mit dazu als Template. Ich habe den letzteren mal unter B_02a rein sortiert, das kannst du natürlich machen wie deine Idee dazu ist ;) Dazu habe ich noch die aktuelle Notfallapotheke und für Pihole die statistiken ;)

Hallo zusammen,
im Template "hp_printer_cartridge_status" gibt es ein paar Zahlendreher:
die Werte für Magenta (reading02XPath-Strict) und Cyan (reading01XPath-Strict) sind vertauscht und der Wert für Schwarz (reading04XPath-Strict) funktioniert nicht.

Würde mich freuen wenn dies im Template angepasst werden könnte:
--- httpmod-orig.template 2020-05-06 23:02:08.000000000 +0200
+++ httpmod.template 2020-05-06 22:42:20.000000000 +0200
@@ -310,13 +310,13 @@
attr DEVICE userattr reading01Name reading01XPath-Strict reading02Name reading02XPath-Strict reading03Name reading03XPath-Strict reading04Name reading04XPath-Strict reading05Name reading05XPath-Strict reading06Name reading06XPath-Strict$
attr DEVICE httpVersion 1.1
attr DEVICE reading01Name Cyan
-attr DEVICE reading01XPath-Strict //ccdyn:ConsumableInfo[2]/dd:ConsumablePercentageLevelRemaining/text()
+attr DEVICE reading01XPath-Strict //ccdyn:ConsumableInfo[3]/dd:ConsumablePercentageLevelRemaining/text()
attr DEVICE reading02Name Magenta
-attr DEVICE reading02XPath-Strict //ccdyn:ConsumableInfo[3]/dd:ConsumablePercentageLevelRemaining/text()
+attr DEVICE reading02XPath-Strict //ccdyn:ConsumableInfo[2]/dd:ConsumablePercentageLevelRemaining/text()
attr DEVICE reading03Name Yellow
attr DEVICE reading03XPath-Strict //ccdyn:ConsumableInfo[4]/dd:ConsumablePercentageLevelRemaining/text()
attr DEVICE reading04Name Black
-attr DEVICE reading04XPath-Strict //ccdyn:ConsumableInfo[1]/dd:ConsumablePercentageLevelRemaining/text()
+attr DEVICE reading04XPath-Strict //ccdyn:ConsumableInfo[5]/dd:ConsumablePercentageLevelRemaining/text()
attr DEVICE reading05Name CyanCatridgeModel
attr DEVICE reading05XPath-Strict //ccdyn:ConsumableInfo[3]/dd:ConsumableSelectibilityNumber/text()
attr DEVICE reading06Name MagentaCatridgeModel


Gruß Schlimbo

Beta-User

Danke für die Info, neue Fassung kommt nachher per update :) .
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files

Lazgar

Hallo!

Hab da mal eine Frage zu dem ORF_weather Template...
Ist es leicht möglich, bei den Werten den "," durch einen "." zu ersetzen?
Wäre toll für die weitere verarbeitung in fhem.

Bin leider nicht so der RegEx-Profi und bring es selber nicht zustande :(

Danke schon mal im Voraus,

Lazgar

Beta-User

Hmm, das sollte mit einer "Nachbearbeitungs-Regex" jeweils gehen, tippe mal auf readingOExpr
Ungetestet könnte das hier passen:
$val =~ s/([\d]+),([\d]+)/$1.$2/ if $val =~ m{\A[\d]+,[\d]+\z};;$val

(Leider geht dieses attrTemplate aus unerfindlichen Gründen auf meinem Testsystem immer noch nicht, sonst könnte ich das austesten... Klappt das denn bei dir?)
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files