Sensor Attribute aktuallisieren

alexamend

Active member
Gibt es eine service mit dem man Sensor attribute aktuallisieren kann,

Ich habe die Integration "Einkaufsliste" (shopping_list) mit Bring! installiert, soweit so gut
Werte werden an die App übtragen sobald ich diese in der Einkaufsliste Eintrage
Werte aus der APP werden nach HA übertragen und die "Liste wird korrekt dargestellt"
nur der zugehörige Sensor bekommt diese Werte nicht mit, dies geschieht erst nchdem ich einen Wert in HA in der Liste eintage.

configuration.yaml
YAML:
  - platform: command_line
    scan_interval: 10
    name: Shopping List
    unique_id: sensor.shopping_list
    command: python3 /config/python_scripts/shopping_list_json.py
    json_attributes:
      - not_complete
      - content
    value_template: "{{ value_json.state }}"

zugehöriges py script , liegt unter -> config\python_scripts\shopping_list_json.py
Python:
#!/usr/local/bin/python
# coding: utf8
import json

with open('/config/.shopping_list.json') as data_file:
   shoppingListData = json.load(data_file)

class shoppingList:
    content = u""
    not_complete = 0
    state = u""

myList = shoppingList()

myList.not_complete = 0
myList.state = ""
myList.content = ""

for entry in shoppingListData:
    if not entry['complete']:
        myList.content += u"- %s\n" % entry['name']
        myList.not_complete += 1

if myList.not_complete == 0:
    myList.state = u"empty"
else:
    myList.state = u"not_empty"


print(json.dumps(myList.__dict__))

So schaut die Liste aus wenn ich von der App nach HA übertrage
shoppung_list_from_app_to_ha.PNG

so schauen die Attribute des Sensor nach dem Übertragen aus

shoppung_list_att_after_app_to_ha.PNG

füge ich jetzt einen Wert unter HA Einkaufsliste hinzu

shoppung_list_add_item_from _ha.png

wird der Sensor komplett aktualisiert und korrekt dargestellt

shoppung_list_updated_after_ad_item.PNG
 
Aktualisiert sich der Sensor denn auch, wenn Du als Dienst "Home Assistant Core Integration: Update entity" ausführst? Dann könnte man das ja eventuell über eine Automatisierung lösen...
 
Aktualisiert sich der Sensor denn auch, wenn Du als Dienst "Home Assistant Core Integration: Update entity" ausführst? Dann könnte man das ja eventuell über eine Automatisierung lösen...
Die Idee war gut... Ich habe es gerade mal versucht, macht aber keinen Unterschied ob als Dienst oder Skript, Attribute werden nicht aktualisiert

YAML:
alias: Bring Einkauf Liste Synchronisation
description: Bring Einkauf Liste Synchronisation
trigger:
  - platform: time_pattern
    hours: "*"
    minutes: /30
    seconds: "0"
condition: []
action:
  - service: shopping_list.bring_sync
    data: {}
  - service: homeassistant.update_entity
    data: {}
    target:
      entity_id: sensor.shopping_list
mode: single
 
Schade, wäre ja auch zu einfach gewesen.

Die Einkäufe sind aber schon in der shopping_list.json abgespeichert, bevor Du in HA etwas hinzufügst - also wenn Du die Datei direkt anschaust?
 
Die Einkäufe sind aber schon in der shopping_list.json abgespeichert, bevor Du in HA etwas hinzufügst - also wenn Du die Datei direkt anschaust?
die ".shopping_list.json" ist auch solange leer bis ich in HA einen Eintrag hinzufüge, danach sind alle anderen auch mit aufgeführt.
 
Okay, dann liegt es schonmal nicht am Sensor.

Hab grade mal nen Blick in den Code von shopping_list geworfen (Python ist nun allerdings echt nicht meine Lieblingssprache...) - gespeichert wird offenbar tatsächlich nur, wenn ein Item auf der Liste hinzugefügt oder geändert wird oder aber "erledigte" Items gelöscht werden.

Ganz vorsichtiger Vorschlag - Du müsstest ja jetzt auch eine custom_components\shopping_list\__init__.py haben, richtig? Wenn ja, einmal öffnen und in Zeile 429 müsste await self.sync_bring() stehen (innerhalb von async def async_load(self): quasi) - darunter eine neue Zeile, genauso eingerückt dieses hinzufügen: await self.hass.async_add_executor_job(self.save) - speichern, neu starten, mal gucken. Ist jetzt aber echt nur geraten.
 
Ich habe es jetzt mal nach deiner Vorgabe eingebunden macht leider keinen Unterschied, kenn mich da leider auch nicht "sonderlich gut" aus,

vergesse den Rest sehe gerade das es dort schon drin ist...



kann es aber sein das dies nicht bei ...async_load

Python:
async def async_load(self):

Python:
        self.items = await self.hass.async_add_executor_job(load)
        for itm in self.items:
            self.map_items[itm["id"]] = self.ha_to_shopping_item(itm)
        await self.sync_bring()
        await self.hass.async_add_executor_job(self.save)

    def save(self):
        """Save the items."""
        save_json(self.hass.config.path(PERSISTENCE), self.items)


sonder hier bei ...async_update rein müsste "nur als gedanke/idee"
ab Zeile 359
Python:
   async def async_update(self, item_id, info):
 
Bei async_update wird es schon ausgeführt (original Zeile 389).

Also save ist auf jeden Fall das, was dann die Datei befüllt - man muss irgendwie den Punkt finden, wo die Sachen bereits von bring geladen sind, und dann das speichern auslösen. Eventuell könnte man sich direkt an das sync_bring ranhängen, danach sollte ja alles da sein.
 
Noch so ein Gedanke, Du könntest eventuell innerhalb der __init.py__ von oben nach unten durcharbeitend an ein paar Stellen entsprechend eingerückt mal _LOGGER.debug('async_load 431: %s', self.items) (Funktionsname und Zeilennummer jeweils anpassen) hinterlassen und dann sollte theoretisch im Log zu sehen sein, wo das erste Mal die items auftauchen beim laden. Das könnte dann der richtige Ort sein, um save auszulösen.
 
hmmm... hat leider nicht zum gewünschten Erfolg geführt, die Werte "Attribute" liegen wo anders in HA, kann leider noch nicht herausfinden wo.
 
Was meinst Du damit bzw. worauf beziehst Du Dich da?
Sorry war zu ungenau ;-) hatte zu viel auf einmal gemacht ...

die übergebenen Werte "attribute" müssen an anderer Stelle abgefragt/gesetzt/übergeben werden ich hatte an jeder stelle ein debug_log rausgegeben, das log bleibt davon völlig unberührt, (ok, sage ich es mal so, ich gehe davon asu das dies an anderer Stelle pasiern muss)
 
Bin mir nicht sicher, ob wir hier vom gleichen sprechen. Die Attribute ansich würde ich vorerst für gleichgültig halten, denn: Die werden ja korrekt gesetzt und auch angezeigt, sobald einmal diese Datei befüllt wurde. Das findet aber, wie gesagt, nur an drei Stellen statt, und "laden der Liste" ist aktuell keine dieser Stellen. Das ist der Punkt, an dem ich ansetzen würde... und ich bin kurz davor zu schauen, ob so ein "Bring-Account" eigentlich was kostet 😂
 
bin kurz davor zu schauen, ob so ein "Bring-Account" eigentlich was kostet 😂
ist kostenfrei, daher habe ich mir für diese entscjhieden, der ofizelle, ist nicht ganz "happy wife" tauglich zudem nutzen wir das schon über Gruppen hinasu da man die Einkaufsliste teilen kann, somit können Kumpels auch mal Bier kaufen das auf der Liste steht :)

Wie gesagt...
Ich gebe Bier in der Lieste in HA ein gefühlt 1 sekunde später sehe ich den Eintrag in der App
Ich Lösche in HA aus der Liste wieder eine Sikunde Später in der Liste der App gelöscht
... alles super
nur anderst herum mag die "S***e" Sache nicht

- HA neustart befüllt sofort den Sensor
- Einen zusätzlichen Eintrag von HA aus, befüllt die Liste

- Ich sehe zwar die Einträge in der Einkaufsliste nur im Sensor stehen die nicht, solange die nicht im Sensor stehen kann ich keine notify schicken den den Inhalt mit listen

was ich gerade noch auf git gefunden habe, dies war die letzt änderung leider ist mein skill dafür nicht sonderlich gut

Python:
            # so all items left in the mapping should be checked items.
            if all_items_mapping[key]["complete"] is False:
                raise vol.Invalid(
  #rem              "The item ids array doesn't contain all the unchecked shopping list items."
  #add              "The item ids array doesn't contain all the unchecked shopping list"
  #add              " items."
                )
            new_items.append(all_items_mapping[key])
        self.items = new_items
 
Zuletzt bearbeitet:
Habs, bei mir funktioniert es nun - das await self.hass.async_add_executor_job(self.save) muss an sync_bring gekoppelt werden:
Python:
    async def sync_bring(self):
        await self.bring.update_lists(self.map_items)

        for itm in self.bring.purchase_list + self.bring.recent_list:
            self.map_items[itm.id] = itm

        self.items = [itm.to_ha() for k, itm in self.map_items.items()]
        
        await self.hass.async_add_executor_job(self.save)
Damit aktualisiert sich dann auch der Sensor, wenn die Automatisierung durchläuft.
 
So bin zum Testen gekommen, vielen DANK für deine mühsame Unterstützung, es funktioniert jetzt auch bei mir mit der Automatisierung
*TOP*
 

Letzte Anleitungen

Statistik des Forums

Themen
4.586
Beiträge
46.929
Mitglieder
4.226
Neuestes Mitglied
jofi01
Zurück
Oben