[HMinfoTools.js] ein WebUI für das modul HMinfo

Begonnen von frank, 12 Juli 2020, 12:28:10

Vorheriges Thema - Nächstes Thema

frank

ZitatSorry nochmal fürs Stören!
zur strafe gibt es ein paar tips um die ohren!  ;)

das attr sumERROR in hminfo sieht sehr spartanisch aus.
du willst wohl eine saubere tabelle haben.  :)

seit HMinfoTools habe ich zusätzlich die liste aus dem 1. post integriert:
1. "cfgState:ok"                                                         => alle entities
2. "sabotageAttack_ErrIoAttack_cnt:ok"                                   => alle devices
3. "R_tempList_State:verified"                                           => HM-CC-TC, HM-CC-RT
4. "R_P1_tempList_State:verified"                                        => HM-TC-IT
5. "R_P2_tempList_State:verified"                                        => HM-TC-IT
6. "R_P3_tempList_State:verified"                                        => HM-TC-IT
7. "valveCtrl:restart:unknown:ok:miss_1:miss_2:miss_3:miss_4:miss_5"     => virtueller HM-CC-TC
8. "smokeChamber:ok"                                                     => HM-SEC-SD-2
9. "alarmTest:ok"                                                        => HM-SEC-SD-2


und dann sehe ich jetzt auch noch zusätzlich diese 3:
10. "sabotageError:off"                                                  => HM-SEC-SC, HM-SEC-RHS
11. "cover:closed"                                                       => HM-SEC-SC, HM-SEC-RHS (veraltetes reading?)
12. "motorErr:ok"                                                        => HM-CC-VD



@all
vielleicht sollte man mal versuchen eine "allgemeine" liste zu erstellen?
diese könnte ich dann in HMinfoTools auf vollständigkeit prüfen und ggf ein hinweis ausgeben.
gibt es meinungen und/oder weitere wichtige ergänzungen?
FHEM: 6.0(SVN) => Pi3(buster)
IO: CUL433|CUL868|HMLAN|HMUSB2|HMUART
CUL_HM: CC-TC|CC-VD|SEC-SD|SEC-SC|SEC-RHS|Sw1PBU-FM|Sw1-FM|Dim1TPBU-FM|Dim1T-FM|ES-PMSw1-Pl
IT: ITZ500|ITT1500|ITR1500|GRR3500
WebUI [HMdeviceTools.js (hm.js)]: https://forum.fhem.de/index.php/topic,106959.0.html

Benni

Zitat von: frank am 09 Januar 2022, 15:48:21
zur strafe gibt es ein paar tips um die ohren!  ;)

Sehr Gerne! ;)

Zitat
das attr sumERROR in hminfo sieht sehr spartanisch aus.
du willst wohl eine saubere tabelle haben.  :)

Mir geht's weniger um eine saubere Tabelle, als um die Benachrichtigungen, die ich im Fehlerfall bekomme.
Die möchte ich ja eigentlich nur bei "echten" Problemen.

Aber das kann ich natürlich auch im entsprechenden notify filtern.

Ich werde das die Tage mal anpassen und um die vorgeschlagenen Einträge ergänzen.

gb#

masterpete23

Ich habe gerade hminfo definiert.
Nun das autoupdate auf 10 minuten gestellt.
Wo / wie kann ich dies aus dem LOG entfernen:
2022.02.23 10:42:27 3: HMinfo hminfo get:update :

frank

moin.

die steuerung der logmeldungen ist immer über verbose möglich.
attr hminfo verbose 2
FHEM: 6.0(SVN) => Pi3(buster)
IO: CUL433|CUL868|HMLAN|HMUSB2|HMUART
CUL_HM: CC-TC|CC-VD|SEC-SD|SEC-SC|SEC-RHS|Sw1PBU-FM|Sw1-FM|Dim1TPBU-FM|Dim1T-FM|ES-PMSw1-Pl
IT: ITZ500|ITT1500|ITR1500|GRR3500
WebUI [HMdeviceTools.js (hm.js)]: https://forum.fhem.de/index.php/topic,106959.0.html

RalfRog

#124
Zitat von: RalfRog am 07 Januar 2022, 10:19:58
Bei mir das Gleiche.
        HMinfoTools.js line 1456:
        TypeError: $(...).attr(...).match(...) is null
Warte mal ab was hier noch kommt, dann werde ich die hier vorgeschlagenen Korrekturen checken/nachziehen.

Die Lösung war ja kurz darauf parat. Umsetzung hat bei mir was länger gedauert  ::) . Beide Tools (HMdeviceTools & HMinfoTools) sind nun auf dem aktuellen Stand und die 98_HMinfo.pm musste ja wie schon angedeutet auch aktualisiert werden (ansich wollte ich erstmal nur die drei Module updaten).
Nach ein paar Merkwürdigkeiten (ich musste FHEM komplett updaten -es waren wohl noch weitere Abhängikkeiten vorhanden- und die fhem.cfg aus dem restoreDir wiederherstellen) sieht nun alles ok aus.


Merwürdig war nach "shutdown restart" z.B.  :
  • lt. Log ist das Update dreimal unmittelbar hintereinander (3 mal tar Backup) gelaufen - bewusst habe ich nur einmal "update update 98_HMinfo.pm" angestoßen
  • reload: Error:Modul 98_HMinfo deactivated (lt. Log)
  • Cannot load module HMinfo / setuuid: Please define hm first (lt. Log)
  • Die HMinfo Definition war warum auch immer aus der fhem.cfg gelöscht
  • Das Attribut IODev ist ebenfalls aus der fhem.cfg gelöscht worden (vermutlich durch Update in 10_CUL_HM.pm seit April letzen Jahres so gewollt)

Aber wie immer:
tolles Tool - danke für die Arbeit  :)
FHEM auf Raspi 2B mit nanoCUL, HM-MOD-RPI-PCB und über LAN MAX!Cube mit a-culFW (Stack 868 + 433)
HM- Fensterkontakte, UP-Schalter, Bewegungsmelder und ein Rauchmelder

frank

es ist immer riskant, wenn man nicht alle moduldateien von martin gemeinsam aktualisiert.
ausserdem war irgendwann auch eine aktuelle fhem.pl pflicht.

die attribute IODev und IOgrp können nur noch einzeln existieren, nicht mehr gemeinsam.
1. am besten checken, ob in jedem hauptdevice (auch virtuelle) eins von beiden existiert.
2. bei nutzung einer vccu sollte jedes hauptdevice das attr IOgrp besitzen.
FHEM: 6.0(SVN) => Pi3(buster)
IO: CUL433|CUL868|HMLAN|HMUSB2|HMUART
CUL_HM: CC-TC|CC-VD|SEC-SD|SEC-SC|SEC-RHS|Sw1PBU-FM|Sw1-FM|Dim1TPBU-FM|Dim1T-FM|ES-PMSw1-Pl
IT: ITZ500|ITT1500|ITR1500|GRR3500
WebUI [HMdeviceTools.js (hm.js)]: https://forum.fhem.de/index.php/topic,106959.0.html

RalfRog

Hi
Danke für die Infos. Zumindest ist jetzt klar warum attr IODev weg war/ist (hatte teilweise beides drin).

Die fhem.cfg hattte ich, nachdem das hminfo-Device weg war, komplett durchgesehen - da nach einem "save config" auf einmal noch ein weiteres Dutzend Zeilen weniger in der Datei war.
Insofern hatte ich (ich habe eine vccu) alle HM Devices geprüft und es war/ist nur noch attr IOgrp vorhanden.

Wenn FHEM läuft und man mal ein paar Monate pausiert hat man schnell was verpasst ::)
FHEM auf Raspi 2B mit nanoCUL, HM-MOD-RPI-PCB und über LAN MAX!Cube mit a-culFW (Stack 868 + 433)
HM- Fensterkontakte, UP-Schalter, Bewegungsmelder und ein Rauchmelder

dadoc

Hallo zusammen,
anscheinend bekomme ich hminfotools.js nicht installiert - und finde es auch nicht zum manuellen Downloaden.
Ich habe die Schritte aus Post #1 durchgeführt, aber die js-Datei erscheint nicht in /www/pgm2. Folglich auf der Seite auch der Fehler "Failed to load resource: the server responded with a status of 404 (Not Found)"
Im Device Overview scheint es da zu sein (?):

DeviceOverview
hm
updated:2022-03-11 12:44:07
update
protoEvents short
rssi
peerXref
configCheck
models

Mach ich da etwas falsch oder ist die js umgezogen? Habe auf git den Eintrag vom 6.1. gesehen:
Zitat2022.01.05 removed HMdeviceTools.js and HMinfoTools.js - using the provided git update method now
Danke & Grüße
Martin
Standort 1: FS20 mit CUL und FHEM auf Raspi. HM-Komponenten (Heizung, Rollladen, Schalter). HM IP über Raspimatic (testweise)
Standort 2: Homematic (Wired) über CCU2 und PocketHome HD
3 x Raspi3 mit piCorePlayer/Kodi für Multiroom Audio (+ Tablets/iPeng/iPods

dadoc

Zitat von: dadoc am 11 März 2022, 13:01:01
anscheinend bekomme ich hminfotools.js nicht installiert - und finde es auch nicht zum manuellen Downloaden.

Hat sich geklärt - hatte übersehen (bzw. wusste nicht), dass ich zum Start noch ein
update all https://raw.githubusercontent.com/frank962/fhem/main/autoupdate/controls_HMtools.txt
machen muss, damit installiert wird.
Danke & Grüße
Martin
Standort 1: FS20 mit CUL und FHEM auf Raspi. HM-Komponenten (Heizung, Rollladen, Schalter). HM IP über Raspimatic (testweise)
Standort 2: Homematic (Wired) über CCU2 und PocketHome HD
3 x Raspi3 mit piCorePlayer/Kodi für Multiroom Audio (+ Tablets/iPeng/iPods

prodigy7

Habe versucht, das eben erstmalig einzurichten, bekomme beim Aufruf vom hminfo Modul aber diese Meldung:
HMinfoTools.js line 1555:
Uncaught TypeError: Cannot read properties of null (reading '0')

Mach ich was falsch?

frank

FHEM: 6.0(SVN) => Pi3(buster)
IO: CUL433|CUL868|HMLAN|HMUSB2|HMUART
CUL_HM: CC-TC|CC-VD|SEC-SD|SEC-SC|SEC-RHS|Sw1PBU-FM|Sw1-FM|Dim1TPBU-FM|Dim1T-FM|ES-PMSw1-Pl
IT: ITZ500|ITT1500|ITR1500|GRR3500
WebUI [HMdeviceTools.js (hm.js)]: https://forum.fhem.de/index.php/topic,106959.0.html

prodigy7

Zitat von: frank am 02 Januar 2023, 21:54:15
zeig mal ein list vom hminfo device.
Da musst du mir vermutlich einen Tipp geben, was ich ausführen/machen soll? 🙈

frank

mein hminfo device hat den namen "hminfo".
für ein list gebe ich dann in die fhem cmdline: list hminfo

zeige zusätzlich die ausgabe vom cmd: version HMinfoTools
FHEM: 6.0(SVN) => Pi3(buster)
IO: CUL433|CUL868|HMLAN|HMUSB2|HMUART
CUL_HM: CC-TC|CC-VD|SEC-SD|SEC-SC|SEC-RHS|Sw1PBU-FM|Sw1-FM|Dim1TPBU-FM|Dim1T-FM|ES-PMSw1-Pl
IT: ITZ500|ITT1500|ITR1500|GRR3500
WebUI [HMdeviceTools.js (hm.js)]: https://forum.fhem.de/index.php/topic,106959.0.html

prodigy7

Ah!

Liste:
Internals:
   FUUID      5c687a12-f33f-cab3-ea91-a63c631e3483b740
   NAME       hminfo
   NOTIFYDEV  global
   NR         33
   NTFY_ORDER 50-hminfo
   STATE      updated:2023-01-02 22:07:01
   TYPE       HMinfo
   Version    01
   eventCount 7
   iERR__actDead Keller.Waschkueche.Device.Thermostat1
   iERR__protocol Wohnung3.Schlafzimmer.Device.RM1
   iI_HM_IOdevices Initialized: CCD;
   iW__protoNames Keller.Waschkueche.Device.Thermostat1,Wohnung3.Schlafzimmer.Device.RM1
   READINGS:
     2023-01-02 22:07:01   CRI__protocol   0
     2023-01-02 21:20:49   C_sumDefined    entities:132,device:38,channel:106,virtual:18
     2023-01-02 22:07:01   ERR__protocol   CmdDel:1,ResndFail:1
     2023-01-02 22:07:01   ERR__unreachable 0
     2023-01-02 21:47:01   I_actTotal      alive:17,dead:1,unkn:2,off:0
     2023-01-02 21:20:49   I_autoReadPend  0
     2023-01-02 21:57:01   I_rssiMinLevel  59<:6 60>:4 80>:1 99>:0
     2023-01-02 21:20:49   I_sum_battery   ok:26,
     2023-01-02 21:20:49   I_sum_sabotageError off:5,
     2023-01-02 22:07:01   W__protocol     CmdPend:1,Resnd:1
     2023-01-02 22:07:01   lastErrChange   updated:2023-01-02 22:07:01
   helper:
     autoUpdate 600
     cfgChkResult configCheck done:-ret--ret- missing register list-ret-    Keller.Waschkueche.Device.Thermostat1: RegL_00.-ret-    Keller.Waschkueche.Device.Thermostat1_Climate: RegL_01.,RegL_07.,RegL_08.,RegL_09.-ret-    Keller.Waschkueche.Device.Thermostat1_SwitchTr: RegL_01.-ret-    Keller.Waschkueche.Device.Thermostat1_Weather: RegL_01.-ret-    Keller.Waschkueche.Device.Thermostat1_WindowRec: RegL_01.-ret-    Keller.Waschkueche.Device.Thermostat1_remote: RegL_01.-ret-    Wohnung3.Jonas.Device.Fenster1: RegL_00.,RegL_01.-ret-    Wohnung3.Kueche.Device.Schalter1: RegL_00.-ret-    Wohnung3.Kueche.Device.Schalter1_Sw_02: RegL_04.Wohnung3.Kueche.Device.Schaltaktor1_Kueche-ret-    Wohnung3.Lena.Device.Fenster1: RegL_00.,RegL_01.-ret-    Wohnung3.Schlafzimmer.Device.Fenster1: RegL_00.,RegL_01.-ret-    Wohnung3.Schlafzimmer.Device.RM1: RegL_00.-ret-    Wohnung3.Schlafzimmer.Device.Thermostat1_Climate: RegL_08.,RegL_09.-ret-    Wohnung3.Unzugeordnet.Device.Fernbedienung2.light: RegL_01.-ret-    Wohnung3.Unzugeordnet.Device.Fernbedienung2.lock: RegL_01.-ret-    Wohnung3.Unzugeordnet.Device.Fernbedienung2.open: RegL_01.-ret-    Wohnung3.Unzugeordnet.Device.Fernbedienung2.unlock: RegL_01.-ret-    Wohnung3.Unzugeordnet.Device.Fernbedienung2: RegL_00.-ret-    Wohnung3.Wohnzimmer.Device.Fenster1: RegL_00.,RegL_01.-ret--ret- incomplete register list-ret-    Wohnung3.Wohnzimmer.Device.Thermostat1_Climate: RegL_07.-ret--ret- peer list incomplete. Use getConfig to read it.-ret-    Wohnung3.Jonas.Device.Fenster1: -ret-    Wohnung3.Lena.Device.Fenster1: -ret-    Wohnung3.Schlafzimmer.Device.Fenster1: -ret-    Wohnung3.Unzugeordnet.Device.Fernbedienung2.light: -ret-    Wohnung3.Unzugeordnet.Device.Fernbedienung2.lock: -ret-    Wohnung3.Unzugeordnet.Device.Fernbedienung2.open: -ret-    Wohnung3.Unzugeordnet.Device.Fernbedienung2.unlock: -ret-    Wohnung3.Wohnzimmer.Device.Fenster1: -ret--ret- peer not verified. Check that peer is set on both sides-ret-    Wohnung3.Jonas.Device.Heizkoerperthermostat1_WindowRec: p:Wohnung3.Jonas.Device.Fenster1-ret-    Wohnung3.Kueche.Device.Schaltaktor1_Esstisch: p:Wohnung3.Wohnzimmer.Device.Schalter1_Sw_01-ret-    Wohnung3.Lena.Device.Heizkoerperthermostat1_WindowRec: p:Wohnung3.Lena.Device.Fenster1-ret-    Wohnung3.Schlafzimmer.Device.Heizkoerperthermostat1_WindowRec: p:Wohnung3.Schlafzimmer.Device.Fenster1-ret-    Wohnung3.Schlafzimmer.Device.Thermostat1_WindowRec: p:Wohnung3.Schlafzimmer.Device.Fenster1-ret-    Wohnung3.Wohnzimmer.Device.Heizkoerperthermostat1_WindowRec: p:Wohnung3.Wohnzimmer.Device.Fenster1-ret-    Wohnung3.Wohnzimmer.Device.Thermostat1_WindowRec: p:Wohnung3.Wohnzimmer.Device.Fenster1-ret--ret- PairedTo missing/unknown-ret-    Keller.Waschkueche.Device.Thermostat1: -ret-    Wohnung3.Jonas.Device.Fenster1: -ret-    Wohnung3.Kueche.Device.Schalter1: -ret-    Wohnung3.Schlafzimmer.Device.Fenster1: -ret-    Wohnung3.Schlafzimmer.Device.RM1: -ret-    Wohnung3.Unzugeordnet.Device.Fernbedienung2: -ret-    Wohnung3.Wohnzimmer.Device.Fenster1: -ret--ret- PairedTo mismatch to IODev-ret-    Wohnung3.Lena.Device.Fenster1: paired:0x000000 IO attr: D67BA3.-ret-    Wohnung3.Wohnzimmer.Device.Schalter1: paired:0x000000 IO attr: D67BA3.-ret--ret- templist mismatch-ret-    Keller.Waschkueche.Device.Thermostat1_Climate: Keller.Waschkueche.Device.Thermostat1_Climate not found in file ./tempList.Urlaub.cfg-ret-    Wohnung3.Arbeitszimmer.Device.Heizkoerperthermostat1_Clima: failed Entries:-ret-     Wohnung3.Arbeitszimmer.Device.Heizkoerperthermostat1_Clima: R_0_tempListSat mismatch 10:30 20.5 11:00 21.0 17:30 20.5 18:00 21.00 24:00 20.5 ne 10:30 20.5 11:00 21.0 17:30 20.5 18:00 21.0 24:00 20.5 ##-ret-     Wohnung3.Arbeitszimmer.Device.Heizkoerperthermostat1_Clima: R_1_tempListSun mismatch 10:30 20.5 11:00 21.0 17:30 20.5 18:00 21.00 24:00 20.5 ne 10:30 20.5 11:00 21.0 17:30 20.5 18:00 21.0 24:00 20.5 ##-ret-     Wohnung3.Arbeitszimmer.Device.Heizkoerperthermostat1_Clima: R_2_tempListMon mismatch 10:30 20.5 11:00 21.0 17:30 20.5 18:00 21.00 24:00 20.5 ne 10:30 20.5 11:00 21.0 17:30 20.5 18:00 21.0 24:00 20.5 ##-ret-     Wohnung3.Arbeitszimmer.Device.Heizkoerperthermostat1_Clima: R_3_tempListTue mismatch 10:30 20.5 11:00 21.0 17:30 20.5 18:00 21.00 24:00 20.5 ne 10:30 20.5 11:00 21.0 17:30 20.5 18:00 21.0 24:00 20.5 ##-ret-     Wohnung3.Arbeitszimmer.Device.Heizkoerperthermostat1_Clima: R_4_tempListWed mismatch 10:30 20.5 11:00 21.0 17:30 20.5 18:00 21.00 24:00 20.5 ne 10:30 20.5 11:00 21.0 17:30 20.5 18:00 21.0 24:00 20.5 ##-ret-     Wohnung3.Arbeitszimmer.Device.Heizkoerperthermostat1_Clima: R_5_tempListThu mismatch 10:30 20.5 11:00 21.0 17:30 20.5 18:00 21.00 24:00 20.5 ne 10:30 20.5 11:00 21.0 17:30 20.5 18:00 21.0 24:00 20.5 ##-ret-     Wohnung3.Arbeitszimmer.Device.Heizkoerperthermostat1_Clima: R_6_tempListFri mismatch 10:30 20.5 11:00 21.0 17:30 20.5 18:00 21.00 24:00 20.5 ne 10:30 20.5 11:00 21.0 17:30 20.5 18:00 21.0 24:00 20.5 ##-ret-    Wohnung3.Schlafzimmer.Device.Thermostat1_Climate: -ret-     Wohnung3.Schlafzimmer.Device.Thermostat1_Climate: tempList 3 not verified-ret-     Wohnung3.Schlafzimmer.Device.Thermostat1_Climate: tempList 2 not verified-ret-    Wohnung3.Wohnzimmer.Device.Thermostat1_Climate: -ret-     Wohnung3.Wohnzimmer.Device.Thermostat1_Climate: tempList 1 not verified-ret-
     weekplanListDef ./tempList.Urlaub.cfg
     weekplanListDir ./
     lastList:
       iERR__actDead Keller.Waschkueche.Device.Thermostat1
       iW__protoNames Keller.Waschkueche.Device.Thermostat1
       iW__unreachNames Wohnung3.Schlafzimmer.Device.RM1
     weekplanList:
       Wohnung3.Arbeitszimmer.Device.Heizkoerperthermostat1_Clima
       Wohnung3.Bad.Device.Heizkoerperthermostat1_Clima
       Wohnung3.Bad.Device.Thermostat1_Climate
       Wohnung3.Jonas.Device.Heizkoerperthermostat1_Clima
       Wohnung3.Lena.Device.Heizkoerperthermostat1_Clima
       Wohnung3.Schlafzimmer.Device.Heizkoerperthermostat1_Clima
       Wohnung3.Schlafzimmer.Device.Thermostat1_Climate
       Wohnung3.Wohnzimmer.Device.Heizkoerperthermostat1_Clima
       Wohnung3.Wohnzimmer.Device.Thermostat1_Climate
       tempList.Arbeit.cfg:Wohnung3.Arbeitszimmer.Device.Heizkoerperthermostat1_Clima
       tempList.Arbeit.cfg:Wohnung3.Bad.Device.Heizkoerperthermostat1_Clima
       tempList.Arbeit.cfg:Wohnung3.Bad.Device.Thermostat1_Climate
       tempList.Arbeit.cfg:Wohnung3.Jonas.Device.Heizkoerperthermostat1_Clima
       tempList.Arbeit.cfg:Wohnung3.Lena.Device.Heizkoerperthermostat1_Clima
       tempList.Arbeit.cfg:Wohnung3.Schlafzimmer.Device.Heizkoerperthermostat1_Clima
       tempList.Arbeit.cfg:Wohnung3.Schlafzimmer.Device.Thermostat1_Climate
       tempList.Arbeit.cfg:Wohnung3.Wohnzimmer.Device.Heizkoerperthermostat1_Clima
       tempList.Arbeit.cfg:Wohnung3.Wohnzimmer.Device.Thermostat1_Climate
   nb:
     cnt        1
Attributes:
   autoUpdate 00:10
   configTempFile tempList.Urlaub.cfg,tempList.Arbeit.cfg
   room       FHEM | Core
   sumERROR   battery:ok,sabotageError:off,powerError:ok,overload:off,overheat:off,reduced:off,motorError:no,error:none,uncertain:yes,smoke_detect:none,cover:closed
   sumStatus  battery,sabotageError,powerError,motor
   webCmd     update:protoEvents short:rssi:peerXref:configCheck:models


Version:
no loaded modules found that match: HMinfoTools

HMinfoTools.js             2011 2022-12-23 12:15:10Z frank
fhemweb.js                 24939 2021-09-09 17:10:37Z rudolfkoenig
fhemweb_readingsGroup.js   15189 2017-10-03 17:53:27Z justme1968


Update von FHEM hatte ich heute erst durchgeführt.

frank

ZitatUpdate von FHEM hatte ich heute erst durchgeführt.
hm...
ich vermute trotzdem, dass 98_HMinfo.pm zu alt ist.

nach dem update fhem restart gemacht?
ist hminfo vom update ausgeschlossen? siehe attr excludeFromUpdate beim device global.

was zeigt der cmd version?
FHEM: 6.0(SVN) => Pi3(buster)
IO: CUL433|CUL868|HMLAN|HMUSB2|HMUART
CUL_HM: CC-TC|CC-VD|SEC-SD|SEC-SC|SEC-RHS|Sw1PBU-FM|Sw1-FM|Dim1TPBU-FM|Dim1T-FM|ES-PMSw1-Pl
IT: ITZ500|ITT1500|ITR1500|GRR3500
WebUI [HMdeviceTools.js (hm.js)]: https://forum.fhem.de/index.php/topic,106959.0.html